prometheus_client: alle Filesysteme anzeigen (ZFS, LVM, NVMe)
Root-Partition + Extra-Datastores (ZFS-Pools, /var/lib/vz etc.) werden jetzt korrekt in Übersicht und Detail angezeigt. Made-with: Cursor
This commit is contained in:
parent
2981e98530
commit
586bedc0eb
1 changed files with 64 additions and 9 deletions
|
|
@ -86,7 +86,7 @@ def get_disk(host: str = None) -> list[dict]:
|
||||||
|
|
||||||
|
|
||||||
def get_disk_bytes(host: str = None) -> list[dict]:
|
def get_disk_bytes(host: str = None) -> list[dict]:
|
||||||
"""Returns available and total bytes per host."""
|
"""Returns available and total bytes for root partition per host."""
|
||||||
filt = f', host="{host}"' if host else ""
|
filt = f', host="{host}"' if host else ""
|
||||||
avail = _by_host(instant_query(
|
avail = _by_host(instant_query(
|
||||||
f'node_filesystem_avail_bytes{{mountpoint="/", host!=""{filt}}}'), "avail_bytes")
|
f'node_filesystem_avail_bytes{{mountpoint="/", host!=""{filt}}}'), "avail_bytes")
|
||||||
|
|
@ -104,6 +104,47 @@ def get_disk_bytes(host: str = None) -> list[dict]:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_filesystems(host: str = None) -> list[dict]:
|
||||||
|
"""All non-trivial filesystems (skips tmpfs, dev, run, boot)."""
|
||||||
|
filt = f', host="{host}"' if host else ""
|
||||||
|
skip = "tmpfs|devtmpfs|efivarfs"
|
||||||
|
q_avail = f'node_filesystem_avail_bytes{{fstype!~"{skip}", host!=""{filt}}}'
|
||||||
|
q_total = f'node_filesystem_size_bytes{{fstype!~"{skip}", host!=""{filt}}}'
|
||||||
|
|
||||||
|
data_a = instant_query(q_avail)
|
||||||
|
data_t = instant_query(q_total)
|
||||||
|
if data_a.get("status") != "success":
|
||||||
|
return []
|
||||||
|
|
||||||
|
total_map = {}
|
||||||
|
for r in data_t.get("data", {}).get("result", []):
|
||||||
|
m = r.get("metric", {})
|
||||||
|
key = (m.get("host", m.get("instance", "?")), m.get("mountpoint", ""))
|
||||||
|
total_map[key] = float(r.get("value", [0, 0])[1])
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for r in data_a.get("data", {}).get("result", []):
|
||||||
|
m = r.get("metric", {})
|
||||||
|
h = m.get("host", m.get("instance", "?"))
|
||||||
|
mp = m.get("mountpoint", "")
|
||||||
|
if mp in ("/boot/efi", "/boot"):
|
||||||
|
continue
|
||||||
|
avail = float(r.get("value", [0, 0])[1])
|
||||||
|
total = total_map.get((h, mp), 0)
|
||||||
|
if total < 500 * 1024 * 1024:
|
||||||
|
continue
|
||||||
|
used_pct = ((total - avail) / total * 100) if total > 0 else 0
|
||||||
|
results.append({
|
||||||
|
"host": h,
|
||||||
|
"mountpoint": mp,
|
||||||
|
"total_gb": total / (1024**3),
|
||||||
|
"avail_gb": avail / (1024**3),
|
||||||
|
"used_pct": used_pct,
|
||||||
|
"device": m.get("device", ""),
|
||||||
|
})
|
||||||
|
return sorted(results, key=lambda x: (x["host"], x["mountpoint"]))
|
||||||
|
|
||||||
|
|
||||||
def get_uptime(host: str = None) -> list[dict]:
|
def get_uptime(host: str = None) -> list[dict]:
|
||||||
filt = f', host="{host}"' if host else ""
|
filt = f', host="{host}"' if host else ""
|
||||||
q = f'node_time_seconds{{host!=""{filt}}} - node_boot_time_seconds{{host!=""{filt}}}'
|
q = f'node_time_seconds{{host!=""{filt}}} - node_boot_time_seconds{{host!=""{filt}}}'
|
||||||
|
|
@ -150,6 +191,11 @@ def format_overview() -> str:
|
||||||
disk_gb = {r["host"]: r for r in get_disk_bytes()}
|
disk_gb = {r["host"]: r for r in get_disk_bytes()}
|
||||||
uptime = {r["host"]: r["value"] for r in get_uptime()}
|
uptime = {r["host"]: r["value"] for r in get_uptime()}
|
||||||
load = {r["host"]: r["value"] for r in get_load()}
|
load = {r["host"]: r["value"] for r in get_load()}
|
||||||
|
all_fs = get_all_filesystems()
|
||||||
|
extra_fs = {}
|
||||||
|
for fs in all_fs:
|
||||||
|
if fs["mountpoint"] != "/":
|
||||||
|
extra_fs.setdefault(fs["host"], []).append(fs)
|
||||||
|
|
||||||
hosts = sorted(set(list(cpu.keys()) + list(mem.keys()) + list(disk.keys())))
|
hosts = sorted(set(list(cpu.keys()) + list(mem.keys()) + list(disk.keys())))
|
||||||
if not hosts:
|
if not hosts:
|
||||||
|
|
@ -177,10 +223,17 @@ def format_overview() -> str:
|
||||||
mem_str = f"{m:.0f}%" if m >= 0 else "n/a"
|
mem_str = f"{m:.0f}%" if m >= 0 else "n/a"
|
||||||
load_str = f"{l5:.1f}" if l5 >= 0 else "n/a"
|
load_str = f"{l5:.1f}" if l5 >= 0 else "n/a"
|
||||||
|
|
||||||
|
extra_line = ""
|
||||||
|
if h in extra_fs:
|
||||||
|
parts = []
|
||||||
|
for efs in extra_fs[h]:
|
||||||
|
parts.append(f"{efs['mountpoint']}: {efs['avail_gb']:.0f}/{efs['total_gb']:.0f} GB frei")
|
||||||
|
extra_line = "\n Storage: " + ", ".join(parts)
|
||||||
|
|
||||||
lines.append(
|
lines.append(
|
||||||
f"{emoji} {h}{warn}\n"
|
f"{emoji} {h}{warn}\n"
|
||||||
f" CPU: {cpu_str} RAM: {mem_str} Disk: {disk_str}\n"
|
f" CPU: {cpu_str} RAM: {mem_str} Disk: {disk_str}\n"
|
||||||
f" Load5: {load_str} Uptime: {_fmt_uptime(u)}"
|
f" Load5: {load_str} Uptime: {_fmt_uptime(u)}{extra_line}"
|
||||||
)
|
)
|
||||||
|
|
||||||
warnings = get_warnings()
|
warnings = get_warnings()
|
||||||
|
|
@ -200,8 +253,7 @@ def format_host_detail(host: str) -> str:
|
||||||
|
|
||||||
cpu = get_cpu(host)
|
cpu = get_cpu(host)
|
||||||
mem = get_memory(host)
|
mem = get_memory(host)
|
||||||
disk = get_disk(host)
|
filesystems = get_all_filesystems(host)
|
||||||
disk_gb = get_disk_bytes(host)
|
|
||||||
uptime = get_uptime(host)
|
uptime = get_uptime(host)
|
||||||
load = get_load(host)
|
load = get_load(host)
|
||||||
|
|
||||||
|
|
@ -213,11 +265,14 @@ def format_host_detail(host: str) -> str:
|
||||||
lines.append(f"CPU: {cpu[0]['value']:.1f}%")
|
lines.append(f"CPU: {cpu[0]['value']:.1f}%")
|
||||||
if mem:
|
if mem:
|
||||||
lines.append(f"RAM: {mem[0]['value']:.1f}%")
|
lines.append(f"RAM: {mem[0]['value']:.1f}%")
|
||||||
if disk:
|
if filesystems:
|
||||||
d_str = f"Disk: {disk[0]['value']:.1f}%"
|
lines.append("Speicher:")
|
||||||
if disk_gb:
|
for fs in filesystems:
|
||||||
d_str += f" ({disk_gb[0]['avail_gb']:.1f} / {disk_gb[0]['total_gb']:.1f} GB frei)"
|
warn = " ⚠️" if fs["used_pct"] >= WARN_DISK else ""
|
||||||
lines.append(d_str)
|
lines.append(
|
||||||
|
f" {fs['mountpoint']}: {fs['used_pct']:.0f}% belegt "
|
||||||
|
f"({fs['avail_gb']:.0f} / {fs['total_gb']:.0f} GB frei){warn}"
|
||||||
|
)
|
||||||
if load:
|
if load:
|
||||||
lines.append(f"Load (5m): {load[0]['value']:.2f}")
|
lines.append(f"Load (5m): {load[0]['value']:.2f}")
|
||||||
if uptime:
|
if uptime:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue