83 lines
2.7 KiB
Python
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)}
|