import os import urllib.request import urllib.error import json import datetime COLLECTOR_URL = "http://metrics-collector.fission.svc.cluster.local:8091/metrics" def main(): now = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S UTC") print(f"[croned] start {now}", flush=True) payload = { "source": "fission-cron-metrics", "hostname": os.uname().nodename, "status": "ok", } # CPU load try: load = os.getloadavg() payload["cpu_load_1m"] = load[0] payload["cpu_load_5m"] = load[1] payload["cpu_load_15m"] = load[2] print(f"[croned] cpu load: 1m={load[0]:.2f} 5m={load[1]:.2f} 15m={load[2]:.2f}", flush=True) except Exception: pass # Memory try: with open("/proc/meminfo") as f: meminfo = {} for line in f: k, v = line.split(":") meminfo[k.strip()] = int(v.split()[0]) total = meminfo.get("MemTotal", 0) / 1024 free = meminfo.get("MemFree", 0) / 1024 avail = meminfo.get("MemAvailable", 0) / 1024 used = total - free payload["memory_total_mb"] = round(total, 1) payload["memory_free_mb"] = round(free, 1) payload["memory_available_mb"] = round(avail, 1) payload["memory_used_mb"] = round(used, 1) payload["memory_percent"] = round(used / total * 100, 1) if total else 0 print(f"[croned] mem: used={round(used,1)}MB / {round(total,1)}MB ({round(used/total*100,1) if total else 0}%)", flush=True) except Exception: pass # Disk try: st = os.statvfs("/") total_gb = st.f_blocks * st.f_frsize / 1024**3 free_gb = st.f_bfree * st.f_frsize / 1024**3 used_gb = total_gb - free_gb payload["disk_total_gb"] = round(total_gb, 1) payload["disk_free_gb"] = round(free_gb, 1) payload["disk_used_gb"] = round(used_gb, 1) print(f"[croned] disk: used={round(used_gb,1)}GB / {round(total_gb,1)}GB", flush=True) except Exception: pass # Uptime try: with open("/proc/uptime") as f: payload["uptime_sec"] = float(f.read().split()[0]) except Exception: pass data = json.dumps(payload).encode() req = urllib.request.Request( COLLECTOR_URL, data=data, headers={"Content-Type": "application/json"}, method="POST", ) try: with urllib.request.urlopen(req, timeout=5) as resp: print(f"[croned] sent OK status={resp.status}", flush=True) return {"ok": True, "status": resp.status} except urllib.error.URLError as e: print(f"[croned] send ERROR: {e}", flush=True) return {"ok": False, "error": str(e)}