#!/usr/bin/env bash # gpu-rocm.sh — AMD-GPU-Metriken via rocm-smi im Influx-Format. # # Aufruf durch Telegraf (inputs.exec). Ausgabe: # gpu_,gpu= value= # z. B. gpu_utilization_gpu,gpu=card0 value=25 # # WICHTIG: 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 hier die KOPFZEILE geparst und die Spalte ueber ihren Namen # zugeordnet — nicht ueber Position oder Suffix. Das ist 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, ' # Spaltenkopf -> Metrikname. Reihenfolge egal, unbekannte Spalten werden ignoriert. function metric_for(header, h) { h = tolower(header) if (h ~ /gpu use|gpu_use|utilization/) return "utilization_gpu" if (h ~ /sensor edge|edge/) return "temperature_edge" if (h ~ /sensor junction|junction/) return "temperature_junction" if (h ~ /sensor memory|memory.*\(c\)/) return "temperature_memory" if (h ~ /power/) return "power_draw" if (h ~ /vram total used|used memory/) return "memory_used" if (h ~ /vram total|total memory/) return "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 "gpu_%s,gpu=%s value=%s\n", col[i], card, num(v) } }' "$TMP"