feat: GPU-Auto-Erkennung (nvidia_smi, rocm-smi); Testserver-Aufraeumen dokumentiert
This commit is contained in:
1 parent
eb5d8b9033
commit
a19bd82189
5 files changed
+122
-13
No files matched your search
@@ -20,6 +20,8 @@ curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/i
|
|||||||
| `--apache-log <pfad>` | Access-Log (Default `/var/log/apache2/access.log`) |
|
| `--apache-log <pfad>` | Access-Log (Default `/var/log/apache2/access.log`) |
|
||||||
| `--uninstall` | alles entfernen |
|
| `--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.
|
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
|
### 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`
|
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.
|
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
|
## Docker-Host ohne root
|
||||||
|
|
||||||
Wer kein sudo hat, aber in der Gruppe `docker` ist: Container-Variante aus
|
Wer kein sudo hat, aber in der Gruppe `docker` ist: Container-Variante aus
|
||||||
|
|||||||
+66
-13
@@ -22,7 +22,12 @@
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
set -eu
|
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)}"
|
NODE_NAME="${NODE_NAME:-$(hostname -s 2>/dev/null || hostname)}"
|
||||||
ROLE="auto"
|
ROLE="auto"
|
||||||
PVE_TOKEN="${PVE_TOKEN:-}"
|
PVE_TOKEN="${PVE_TOKEN:-}"
|
||||||
@@ -34,7 +39,8 @@ UNINSTALL=0
|
|||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--name) NODE_NAME="$2"; shift 2 ;;
|
--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 ;;
|
--role) ROLE="$2"; shift 2 ;;
|
||||||
--pve-token) PVE_TOKEN="$2"; shift 2 ;;
|
--pve-token) PVE_TOKEN="$2"; shift 2 ;;
|
||||||
--apache-log) APACHE_LOG="$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; }
|
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)."
|
[ "$(id -u)" -eq 0 ] || die "Bitte als root ausführen (sudo)."
|
||||||
|
[ -n "$TELEGRAF_TOKEN" ] || die "Kein Token: --token <Bearer-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
|
# Uninstall
|
||||||
@@ -80,22 +94,31 @@ esac
|
|||||||
|
|
||||||
IS_PVE=0; command -v pveversion >/dev/null 2>&1 && IS_PVE=1
|
IS_PVE=0; command -v pveversion >/dev/null 2>&1 && IS_PVE=1
|
||||||
HAS_DOCKER=0; [ -S /var/run/docker.sock ] && HAS_DOCKER=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
|
HAS_APACHE=0; { command -v apache2ctl >/dev/null 2>&1 || command -v httpd >/dev/null 2>&1; } && HAS_APACHE=1
|
||||||
if [ "$ROLE" = "auto" ]; then
|
if [ "$ROLE" = "auto" ]; then
|
||||||
ROLE="none"
|
ROLE="none"
|
||||||
[ "$IS_PVE" -eq 1 ] && ROLE="proxmox"
|
[ "$IS_PVE" -eq 1 ] && ROLE="proxmox"
|
||||||
fi
|
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)
|
# Erreichbarkeit des Collectors (NetBird Lazy Connection: erst anklopfen)
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
if command -v curl >/dev/null; then
|
if command -v curl >/dev/null; then
|
||||||
ping -c1 -W2 "$COLLECTOR" >/dev/null 2>&1 || true
|
HOST_OF_URL="$(printf '%s' "$PROM_URL" | sed -E 's#^https?://([^/:]+).*#\1#')"
|
||||||
if curl -fsS -m 8 "http://$COLLECTOR:9090/-/ready" >/dev/null 2>&1; then
|
ping -c1 -W2 "$HOST_OF_URL" >/dev/null 2>&1 || true # NetBird Lazy Connection wecken
|
||||||
log "Collector erreichbar."
|
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
|
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
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -184,9 +207,10 @@ mkdir -p /etc/telegraf/telegraf.d /etc/default
|
|||||||
umask 077
|
umask 077
|
||||||
cat > /etc/default/telegraf <<EOF
|
cat > /etc/default/telegraf <<EOF
|
||||||
NODE_NAME=$NODE_NAME
|
NODE_NAME=$NODE_NAME
|
||||||
COLLECTOR=$COLLECTOR
|
COLLECTOR=${COLLECTOR:-}
|
||||||
PROM_URL=http://$COLLECTOR:9090/api/v1/write
|
PROM_URL=$PROM_URL
|
||||||
LOKI_URL=http://$COLLECTOR:3100
|
LOKI_URL=$LOKI_URL
|
||||||
|
TELEGRAF_TOKEN=$TELEGRAF_TOKEN
|
||||||
PVE_TOKEN=$PVE_TOKEN
|
PVE_TOKEN=$PVE_TOKEN
|
||||||
APACHE_LOG=$APACHE_LOG
|
APACHE_LOG=$APACHE_LOG
|
||||||
EOF
|
EOF
|
||||||
@@ -204,6 +228,32 @@ case "$ROLE" in
|
|||||||
*) die "Unbekannte Rolle: $ROLE" ;;
|
*) die "Unbekannte Rolle: $ROLE" ;;
|
||||||
esac
|
esac
|
||||||
[ "$HAS_APACHE" -eq 1 ] && [ "$ROLE" != "apache" ] && { fetch apache.conf /etc/telegraf/telegraf.d/apache.conf; usermod -aG adm telegraf 2>/dev/null || true; }
|
[ "$HAS_APACHE" -eq 1 ] && [ "$ROLE" != "apache" ] && { fetch apache.conf /etc/telegraf/telegraf.d/apache.conf; usermod -aG adm telegraf 2>/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
|
chown -R telegraf:telegraf /etc/telegraf 2>/dev/null || true
|
||||||
|
|
||||||
# Konfig testen
|
# 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."
|
rc-service telegraf restart >/dev/null 2>&1 || log "HINWEIS: OpenRC nicht aktiv (Container?) — Dienst beim nächsten Boot."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "OK — Node '$NODE_NAME' liefert an http://$COLLECTOR:9090 (Metriken) und :3100 (Logs)."
|
PROM_BASE="$(printf '%s' "$PROM_URL" | sed -E 's#/api/v1/write/?$##')"
|
||||||
log "Prüfen: curl -s 'http://$COLLECTOR:9090/api/v1/query?query=system_uptime{node=\"$NODE_NAME\"}'"
|
[ "$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 "Grafana: http://$COLLECTOR:3000 (nur im NetBird)"
|
|
||||||
|
log "OK — Node '$NODE_NAME' liefert an $PROM_URL (Metriken) und $LOKI_URL (Logs)."
|
||||||
|
log "Prüfen: curl -s -H 'Authorization: Bearer <TOKEN>' '$PROM_BASE/api/v1/query?query=system_uptime{node=\"$NODE_NAME\"}'"
|
||||||
|
log "Grafana: http://100.83.134.46:3000 (nur im NetBird)"
|
||||||
Executable
+20
@@ -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
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
Content-Type = "application/x-protobuf"
|
Content-Type = "application/x-protobuf"
|
||||||
Content-Encoding = "snappy"
|
Content-Encoding = "snappy"
|
||||||
X-Prometheus-Remote-Write-Version = "0.1.0"
|
X-Prometheus-Remote-Write-Version = "0.1.0"
|
||||||
|
Authorization = "Bearer ${TELEGRAF_TOKEN}"
|
||||||
|
|
||||||
# ---- Logs → Loki (imac) ----
|
# ---- Logs → Loki (imac) ----
|
||||||
[[outputs.loki]]
|
[[outputs.loki]]
|
||||||
@@ -31,6 +32,7 @@
|
|||||||
namepass = ["docker_log", "apache_log"]
|
namepass = ["docker_log", "apache_log"]
|
||||||
sanitize_label_names = true
|
sanitize_label_names = true
|
||||||
metric_name_label = ""
|
metric_name_label = ""
|
||||||
|
http_headers = { "Authorization" = "Bearer ${TELEGRAF_TOKEN}" }
|
||||||
|
|
||||||
# ---- Host-Metriken ----
|
# ---- Host-Metriken ----
|
||||||
[[inputs.cpu]]
|
[[inputs.cpu]]
|
||||||
|
|||||||
@@ -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"
|
||||||
Reference in new issue
Block a user