From 21fbb4ad1470ab73134811f5592aa8f8ad304cd1 Mon Sep 17 00:00:00 2001 From: guyg1474 <340572510+guyg1474@users.noreply.github.com> Date: Wed, 14 Oct 2026 16:04:59 +0200 Subject: [PATCH] Hostname aus /etc/hostname des Hosts statt Container-ID, veth-Schnittstellen ausblenden Co-Authored-By: Claude Opus 5.5 --- README.md | 3 ++- app/collector.py | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d7ac6d4..c7a4b61 100644 --- a/README.md +++ b/README.md @@ -146,8 +146,9 @@ Hinweise zu den Feldern: - `memory.usedBytes` ist der tatsächlich belegte Speicher, also ohne Cache, der jederzeit freigegeben werden kann. Das entspricht der Spalte „used“ von `free`. - `disks[].percent` wird wie bei `df` berechnet. `freeBytes` ist der für Benutzer verfügbare Platz. -- `network.rxBytesPerSec`/`txBytesPerSec` summiert nur echte Schnittstellen. Docker-Bridges und `veth*` +- `network.rxBytesPerSec`/`txBytesPerSec` summiert nur echte Schnittstellen. Docker-Bridges (`docker0`, `br-*`) stehen mit `"virtual": true` in der Liste, werden aber nicht mitgezählt, sonst zählt Container-Verkehr doppelt. + Die `veth*`-Schnittstellen der einzelnen Container werden gar nicht gelistet. - `temperatures`: welche Sensoren es gibt, hängt von der Hardware ab. Die Liste kann leer sein (z. B. bei VMs) und `criticalCelsius` kann `null` sein. - `cpu.mhz` ist der Durchschnitt aller Threads und kann bei VMs `null` sein. diff --git a/app/collector.py b/app/collector.py index 0cf76db..44e196c 100644 --- a/app/collector.py +++ b/app/collector.py @@ -205,6 +205,12 @@ def _cpu_mhz() -> float | None: return round(sum(freqs) / len(freqs)) if freqs else None +def _hostname() -> str | None: + # /proc/sys/kernel/hostname liefert im Container dessen ID (eigener UTS-Namespace), + # daher zuerst die Datei des Hosts + return _read_or(_host_path("/etc/hostname")) or _read_or(f"{HOST_PROC}/sys/kernel/hostname") + + def _os_name() -> str | None: for path in (_host_path("/etc/os-release"), _host_path("/usr/lib/os-release")): text = _read_or(path) @@ -242,7 +248,8 @@ def snapshot(prev: dict, cur: dict, interval: int) -> dict: net, rx_sum, tx_sum = [], 0, 0 for name, (rx, tx) in sorted(cur["net"].items()): - if name == "lo": + # veth*: eine pro Container mit Zufallsnamen – nur Rauschen in der Liste + if name == "lo" or name.startswith("veth"): continue p_rx, p_tx = prev["net"].get(name, (rx, tx)) rx_rate, tx_rate = _rate(rx, p_rx, seconds), _rate(tx, p_tx, seconds) @@ -268,7 +275,7 @@ def snapshot(prev: dict, cur: dict, interval: int) -> dict: "timestamp": datetime.now().astimezone().isoformat(timespec="seconds"), "intervalSeconds": interval, "host": { - "hostname": _read_or(f"{HOST_PROC}/sys/kernel/hostname"), + "hostname": _hostname(), "os": _os_name(), "kernel": _read_or(f"{HOST_PROC}/sys/kernel/osrelease"), "uptimeSeconds": int(uptime),