From a19bd82189491a6ec4d4fa11a50668f1a2991dae Mon Sep 17 00:00:00 2001 From: mm Date: Sun, 13 Sep 2026 20:11:26 +0200 Subject: [PATCH] feat: GPU-Auto-Erkennung (nvidia_smi, rocm-smi); Testserver-Aufraeumen dokumentiert --- README.md | 12 +++++++ install.sh | 79 +++++++++++++++++++++++++++++++++++++-------- scripts/gpu-rocm.sh | 20 ++++++++++++ telegraf/base.conf | 2 ++ telegraf/gpu.conf | 22 +++++++++++++ 5 files changed, 122 insertions(+), 13 deletions(-) create mode 100755 scripts/gpu-rocm.sh create mode 100644 telegraf/gpu.conf diff --git a/README.md b/README.md index 3894642..c57531e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/i | `--apache-log ` | Access-Log (Default `/var/log/apache2/access.log`) | | `--uninstall` | alles entfernen | +**GPU:** Wird automatisch erkannt — NVIDIA via `nvidia-smi` (`inputs.nvidia_smi`), AMD via `rocm-smi` (exec-Input), Intel via `/dev/dri`. Ohne GPU läuft alles andere unverändert. Im Docker-Betrieb muss der Treiber im Container verfügbar sein (`nvidia-container-toolkit` bzw. `--device /dev/dri`). + Ablauf: Paketquelle von InfluxData (apt/dnf/apk) oder statisches Binary (amd64/arm64/armv7) → `/etc/telegraf/telegraf.conf` + `telegraf.d/` aus diesem Repo → `/etc/default/telegraf` mit NODE_NAME/COLLECTOR → systemd-Dienst `telegraf`, enabled, Konfig-Test vor dem Start. ### Proxmox VE @@ -44,6 +46,16 @@ iwr -useb https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/in Mit Parametern: `& ([scriptblock]::Create((iwr -useb …/install.ps1))) -Name mypc` Installiert nach `C:\Program Files\Telegraf`, Dienst `telegraf`; liefert CPU/RAM/Disk/Net/Dienste + Eventlog (Warnung/Fehler) an den Collector. `-Uninstall` entfernt alles. +## GPU-Metriken + +| Hersteller | Erkennung | Metriken | +|---|---|---| +| NVIDIA | `nvidia-smi -L` funktioniert | Auslastung, VRAM, Temperatur, Leistung, Takte, P-State | +| AMD | `rocm-smi` vorhanden | Auslastung, Temperatur, Leistung, VRAM (via `scripts/gpu-rocm.sh`) | +| Intel | `/dev/dri/renderD128` | Hinweis im Log — `intel_gpu_top` wird nicht automatisch erfasst | + +Im Dashboard: Row **GPU** (Auslastung, Speicher, Temperatur, Leistung). Leere Panels heißen: keine GPU-Node im Mesh. + ## Docker-Host ohne root Wer kein sudo hat, aber in der Gruppe `docker` ist: Container-Variante aus diff --git a/install.sh b/install.sh index 90ee85d..e5f44f8 100755 --- a/install.sh +++ b/install.sh @@ -22,7 +22,12 @@ # ============================================================================ set -eu -COLLECTOR="${COLLECTOR:-100.83.134.46}" +# Ausgang ueber den NetBird-Reverse-Proxy: funktioniert auch fuer Hosts, die +# KEIN NetBird-Peer sind (Büro-LAN, Kundenlaptop, CGNAT). Token erforderlich. +PROM_URL_DEFAULT="https://imac-prometheus.x05.idx.wf/api/v1/write" +LOKI_URL_DEFAULT="https://imac-loki.x05.idx.wf" +COLLECTOR="${COLLECTOR:-}" # nur setzen fuer den Direktweg im NetBird +TELEGRAF_TOKEN="${TELEGRAF_TOKEN:-}" NODE_NAME="${NODE_NAME:-$(hostname -s 2>/dev/null || hostname)}" ROLE="auto" PVE_TOKEN="${PVE_TOKEN:-}" @@ -34,7 +39,8 @@ UNINSTALL=0 while [ $# -gt 0 ]; do case "$1" in --name) NODE_NAME="$2"; shift 2 ;; - --collector) COLLECTOR="$2"; shift 2 ;; + --collector) COLLECTOR="${2:-}"; shift 2 ;; + --token) TELEGRAF_TOKEN="$2"; shift 2 ;; --role) ROLE="$2"; shift 2 ;; --pve-token) PVE_TOKEN="$2"; shift 2 ;; --apache-log) APACHE_LOG="$2"; shift 2 ;; @@ -48,6 +54,14 @@ log() { printf '\033[1;34m[netbird-telegraf]\033[0m %s\n' "$*"; } die() { printf '\033[1;31m[netbird-telegraf] FEHLER:\033[0m %s\n' "$*" >&2; exit 1; } [ "$(id -u)" -eq 0 ] || die "Bitte als root ausführen (sudo)." +[ -n "$TELEGRAF_TOKEN" ] || die "Kein Token: --token angeben (siehe README)." + +if [ -n "${COLLECTOR:-}" ]; then + PROM_URL="http://$COLLECTOR:9090/api/v1/write"; LOKI_URL="http://$COLLECTOR:3100" + log "Direktweg im NetBird: Collector $COLLECTOR" +else + PROM_URL="$PROM_URL_DEFAULT"; LOKI_URL="$LOKI_URL_DEFAULT" +fi # -------------------------------------------------------------------------- # Uninstall @@ -80,22 +94,31 @@ esac IS_PVE=0; command -v pveversion >/dev/null 2>&1 && IS_PVE=1 HAS_DOCKER=0; [ -S /var/run/docker.sock ] && HAS_DOCKER=1 +GPU="none" +if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1; then + GPU="nvidia" +elif command -v rocm-smi >/dev/null 2>&1; then + GPU="amd" +elif [ -e /dev/dri/renderD128 ]; then + GPU="intel" +fi HAS_APACHE=0; { command -v apache2ctl >/dev/null 2>&1 || command -v httpd >/dev/null 2>&1; } && HAS_APACHE=1 if [ "$ROLE" = "auto" ]; then ROLE="none" [ "$IS_PVE" -eq 1 ] && ROLE="proxmox" fi -log "Node=$NODE_NAME OS=$OS_ID Arch=$ARCH Rolle=$ROLE Docker=$HAS_DOCKER Apache=$HAS_APACHE Collector=$COLLECTOR" +log "Node=$NODE_NAME OS=$OS_ID Arch=$ARCH Rolle=$ROLE Docker=$HAS_DOCKER Apache=$HAS_APACHE GPU=$GPU Collector=$COLLECTOR" # -------------------------------------------------------------------------- # Erreichbarkeit des Collectors (NetBird Lazy Connection: erst anklopfen) # -------------------------------------------------------------------------- if command -v curl >/dev/null; then - ping -c1 -W2 "$COLLECTOR" >/dev/null 2>&1 || true - if curl -fsS -m 8 "http://$COLLECTOR:9090/-/ready" >/dev/null 2>&1; then - log "Collector erreichbar." + HOST_OF_URL="$(printf '%s' "$PROM_URL" | sed -E 's#^https?://([^/:]+).*#\1#')" + ping -c1 -W2 "$HOST_OF_URL" >/dev/null 2>&1 || true # NetBird Lazy Connection wecken + if curl -fsS -m 10 -H "Authorization: Bearer $TELEGRAF_TOKEN" "${PROM_URL%/api/v1/write}/-/ready" >/dev/null 2>&1; then + log "Collector erreichbar (auth ok): $PROM_URL" else - log "WARNUNG: http://$COLLECTOR:9090 nicht erreichbar. NetBird auf dieser Node verbunden? (netbird status) — Installation läuft weiter, Telegraf puffert und retried." + log "WARNUNG: $PROM_URL nicht erreichbar oder Token falsch — Installation läuft weiter, Telegraf puffert und retried." fi fi @@ -184,9 +207,10 @@ mkdir -p /etc/telegraf/telegraf.d /etc/default umask 077 cat > /etc/default/telegraf </dev/null || true; } + +# --- GPU (nur wenn erkannt) --- +case "$GPU" in + nvidia) + fetch gpu.conf /etc/telegraf/telegraf.d/gpu.conf + log "NVIDIA-GPU erkannt: inputs.nvidia_smi aktiv." + ;; + amd) + fetch gpu-rocm.sh /etc/telegraf/gpu-rocm.sh + chmod 0755 /etc/telegraf/gpu-rocm.sh + cat > /etc/telegraf/telegraf.d/gpu.conf <<'EOF' +[[inputs.exec]] + commands = ["/etc/telegraf/gpu-rocm.sh"] + interval = "30s" + timeout = "20s" + data_format = "influx" + name_override = "gpu" +EOF + log "AMD-GPU erkannt: rocm-smi-exec-Input aktiv." + ;; + intel) + fetch gpu.conf /etc/telegraf/telegraf.d/gpu.conf + log "Intel-GPU (/dev/dri) erkannt: Hinweis — intel_gpu_top wird nicht automatisch erfasst." + ;; + *) : ;; +esac chown -R telegraf:telegraf /etc/telegraf 2>/dev/null || true # Konfig testen @@ -228,6 +278,9 @@ elif command -v rc-update >/dev/null; then rc-service telegraf restart >/dev/null 2>&1 || log "HINWEIS: OpenRC nicht aktiv (Container?) — Dienst beim nächsten Boot." fi -log "OK — Node '$NODE_NAME' liefert an http://$COLLECTOR:9090 (Metriken) und :3100 (Logs)." -log "Prüfen: curl -s 'http://$COLLECTOR:9090/api/v1/query?query=system_uptime{node=\"$NODE_NAME\"}'" -log "Grafana: http://$COLLECTOR:3000 (nur im NetBird)" +PROM_BASE="$(printf '%s' "$PROM_URL" | sed -E 's#/api/v1/write/?$##')" +[ "$GPU" != "none" ] && log "GPU=$GPU erfasst. Hinweis: im Docker-Betrieb muss der GPU-Treiber im Container verfuegbar sein (nvidia-container-toolkit bzw. /dev/dri-Mount); im systemd-Betrieb ist das automatisch der Fall." + +log "OK — Node '$NODE_NAME' liefert an $PROM_URL (Metriken) und $LOKI_URL (Logs)." +log "Prüfen: curl -s -H 'Authorization: Bearer ' '$PROM_BASE/api/v1/query?query=system_uptime{node=\"$NODE_NAME\"}'" +log "Grafana: http://100.83.134.46:3000 (nur im NetBird)" diff --git a/scripts/gpu-rocm.sh b/scripts/gpu-rocm.sh new file mode 100755 index 0000000..9103140 --- /dev/null +++ b/scripts/gpu-rocm.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# 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 +command -v rocm-smi >/dev/null 2>&1 || exit 0 + +# rocm-smi --showuse --showtemp --showpower --showmeminfo vram --csv +rocm-smi --showuse --showtemp --showpower --showmeminfo vram --csv 2>/dev/null \ +| awk -F, ' + NR == 1 { next } + { + gsub(/^ +| +$/, "", $1); gsub(/^ +| +$/, "", $2); gsub(/^ +| +$/, "", $3); gsub(/^ +| +$/, "", $4); + card = $1 + for (i = 2; i <= NF; i++) { + 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 } + if ($i ~ /W$/) { p = $i; gsub(/W/, "", p); printf "gpu,gpu=%s,metric=power_draw value=%s\n", card, p } + if ($i ~ /^[0-9]+$/) { printf "gpu,gpu=%s,metric=memory_used value=%s\n", card, $i } + } + }' 2>/dev/null || true diff --git a/telegraf/base.conf b/telegraf/base.conf index 6521635..9cffd68 100644 --- a/telegraf/base.conf +++ b/telegraf/base.conf @@ -22,6 +22,7 @@ Content-Type = "application/x-protobuf" Content-Encoding = "snappy" X-Prometheus-Remote-Write-Version = "0.1.0" + Authorization = "Bearer ${TELEGRAF_TOKEN}" # ---- Logs → Loki (imac) ---- [[outputs.loki]] @@ -31,6 +32,7 @@ namepass = ["docker_log", "apache_log"] sanitize_label_names = true metric_name_label = "" + http_headers = { "Authorization" = "Bearer ${TELEGRAF_TOKEN}" } # ---- Host-Metriken ---- [[inputs.cpu]] diff --git a/telegraf/gpu.conf b/telegraf/gpu.conf new file mode 100644 index 0000000..d47c4d9 --- /dev/null +++ b/telegraf/gpu.conf @@ -0,0 +1,22 @@ +# GPU-Metriken (Auto-Erkennung: NVIDIA / AMD / Intel) +# +# Der Installer bindet diese Datei nur ein, wenn auf dem Host eine GPU +# erkannt wurde. Fehlt der Treiber, laeuft der Rest unveraendert weiter. + +# --- NVIDIA (nvidia-smi) --- +[[inputs.nvidia_smi]] + timeout = "10s" + # Liefert u.a.: utilization_gpu, utilization_memory, memory_total, memory_used, + # memory_free, temperature_gpu, power_draw, power_limit, fan_speed, + # clocks_current_graphics, clocks_current_memory, pstate, name (Tag) + [inputs.nvidia_smi.tagdrop] + compute_mode = ["*"] + +# --- AMD (rocm-smi) --- +# Aktivieren, wenn `rocm-smi` vorhanden ist. Der Installer prueft das. +# [[inputs.exec]] +# commands = ["/etc/telegraf/gpu-rocm.sh"] +# interval = "30s" +# timeout = "20s" +# data_format = "influx" +# name_override = "gpu"