57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""System health check - collects key metrics and writes JSON report."""
|
|
|
|
import json
|
|
import os
|
|
import platform
|
|
import subprocess
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
|
|
def get_disk_usage(path="/"):
|
|
result = subprocess.run(["df", "-h", path], capture_output=True, text=True)
|
|
lines = result.stdout.strip().split("\n")
|
|
if len(lines) >= 2:
|
|
parts = lines[1].split()
|
|
return {"total": parts[1], "used": parts[2], "available": parts[3], "use_percent": parts[4]}
|
|
return None
|
|
|
|
def get_memory_info():
|
|
try:
|
|
with open("/proc/meminfo") as f:
|
|
lines = f.readlines()[:6]
|
|
return {line.split(":")[0].strip(): line.split(":")[1].strip() for line in lines}
|
|
except:
|
|
return None
|
|
|
|
def get_load_avg():
|
|
try:
|
|
with open("/proc/loadavg") as f:
|
|
parts = f.read().strip().split()
|
|
return {"1min": parts[0], "5min": parts[1], "15min": parts[2], "processes": parts[3]}
|
|
except:
|
|
return None
|
|
|
|
def get_process_count():
|
|
try:
|
|
return len([p for p in Path("/proc").iterdir() if p.name.isdigit()])
|
|
except:
|
|
return None
|
|
|
|
def main():
|
|
report = {
|
|
"timestamp": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
|
|
"hostname": platform.node(),
|
|
"os": platform.system(),
|
|
"kernel": platform.release(),
|
|
"python": platform.python_version(),
|
|
"disk_root": get_disk_usage("/"),
|
|
"memory": get_memory_info(),
|
|
"load_avg": get_load_avg(),
|
|
"process_count": get_process_count(),
|
|
}
|
|
print(json.dumps(report, indent=2))
|
|
return report
|
|
|
|
if __name__ == "__main__":
|
|
main() |