56 lines
1.9 KiB
Bash
Executable File
56 lines
1.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# gpu-rocm.sh — AMD-GPU-Metriken via rocm-smi im Influx-Format.
|
|
#
|
|
# Aufruf durch Telegraf (inputs.exec). Ausgabe:
|
|
# gpu_<metrik>,gpu=<karte> value=<zahl>
|
|
# 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"
|