fix(gpu-amd): Metriknamen statt Tag metric=; Parser sucht Werte anhand der Einheit
This commit is contained in:
1 parent
f99e46fd96
commit
0674360563
1 file changed
+42
-16
+42
-16
@@ -1,20 +1,46 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# gpu-rocm.sh — AMD-GPU-Metriken via rocm-smi im Influx-Format.
|
# gpu-rocm.sh — AMD-GPU-Metriken via rocm-smi im Influx-Format.
|
||||||
# Wird vom Telegraf-exec-Input gpu.conf aufgerufen (nur wenn rocm-smi existiert).
|
#
|
||||||
set -eu
|
# Aufruf durch Telegraf (inputs.exec). Wirft Zeilen der Form
|
||||||
command -v rocm-smi >/dev/null 2>&1 || exit 0
|
# gpu_<metrik>,gpu=<karte> value=<zahl>
|
||||||
|
# aus, z. B. gpu_utilization_gpu,gpu=card0 value=37
|
||||||
|
#
|
||||||
|
# Robust gegen unterschiedliche rocm-smi-Ausgaben: wirft pro Karte EINE
|
||||||
|
# CSV-Zeile aus und sucht die Werte anhand ihrer Einheit (%, °C, W, MB/GB),
|
||||||
|
# nicht anhand der Spaltenposition.
|
||||||
|
|
||||||
# rocm-smi --showuse --showtemp --showpower --showmeminfo vram --csv
|
set -eu
|
||||||
rocm-smi --showuse --showtemp --showpower --showmeminfo vram --csv 2>/dev/null \
|
|
||||||
| awk -F, '
|
if ! command -v rocm-smi >/dev/null 2>&1; then
|
||||||
NR == 1 { next }
|
echo "# rocm-smi nicht gefunden" >&2
|
||||||
{
|
exit 0
|
||||||
gsub(/^ +| +$/, "", $1); gsub(/^ +| +$/, "", $2); gsub(/^ +| +$/, "", $3); gsub(/^ +| +$/, "", $4);
|
fi
|
||||||
card = $1
|
|
||||||
for (i = 2; i <= NF; i++) {
|
TMP="$(mktemp)"; trap 'rm -f "$TMP"' EXIT
|
||||||
if ($i ~ /%/) { g = $i; gsub(/%/, "", g); printf "gpu,gpu=%s,metric=utilization_gpu value=%s\n", card, g }
|
|
||||||
if ($i ~ /c$/) { t = $i; gsub(/c/, "", t); printf "gpu,gpu=%s,metric=temperature_gpu value=%s\n", card, t }
|
rocm-smi --showuse --showtemp --showpower --showmeminfo vram --showproductname --csv \
|
||||||
if ($i ~ /W$/) { p = $i; gsub(/W/, "", p); printf "gpu,gpu=%s,metric=power_draw value=%s\n", card, p }
|
> "$TMP" 2>/dev/null || true
|
||||||
if ($i ~ /^[0-9]+$/) { printf "gpu,gpu=%s,metric=memory_used value=%s\n", card, $i }
|
[ -s "$TMP" ] || exit 0
|
||||||
|
|
||||||
|
awk -F, '
|
||||||
|
function num(s) { gsub(/[^0-9.]/, "", s); return s }
|
||||||
|
function emit(name, val, card) {
|
||||||
|
if (val != "" && val != "N/A") printf "gpu_%s,gpu=%s value=%s\n", name, card, val
|
||||||
}
|
}
|
||||||
}' 2>/dev/null || true
|
NR == 1 { next } # Kopfzeile: Spaltennamen merken
|
||||||
|
{
|
||||||
|
card = $1
|
||||||
|
gsub(/^[ \t]+|[ \t]+$/, "", card)
|
||||||
|
if (card == "") next
|
||||||
|
for (i = 2; i <= NF; i++) {
|
||||||
|
v = $i
|
||||||
|
gsub(/^[ \t]+|[ \t]+$/, "", v)
|
||||||
|
if (v == "" || v == "N/A" || v ~ /^\[/) continue
|
||||||
|
if (v ~ /%/) { emit("utilization_gpu", num(v), card); continue }
|
||||||
|
if (v ~ /c$|C$/) { emit("temperature_gpu", num(v), card); continue }
|
||||||
|
if (v ~ /W$/) { emit("power_draw", num(v), card); continue }
|
||||||
|
# rocm-smi liefert VRAM entweder als "1.0 GB"/"512 MB" oder roh in Bytes
|
||||||
|
if (v ~ /[KMG]i?B/) { emit("memory_used", num(v), card); continue }
|
||||||
|
if (v ~ /^[0-9]{6,}$/) { emit("memory_used", num(v) / 1048576, card); continue }
|
||||||
|
}
|
||||||
|
}' "$TMP"
|
||||||
Reference in new issue
Block a user