Files
fission-console/examples/big-suite/code/python-metrics/croned.py
T

83 lines
2.7 KiB
Python

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)}