Files
crypto_monitor/hub_host_status_lib.py

99 lines
2.8 KiB
Python

"""中控:本机 CPU / 内存 / 磁盘 / 网络快照(监控区服务器状态条)。"""
from __future__ import annotations
import os
import socket
import time
from typing import Any
_state: dict[str, Any] = {
"primed": False,
"net_ts": 0.0,
"net_sent": 0,
"net_recv": 0,
}
def _disk_path() -> str:
raw = (os.getenv("HUB_HOST_DISK_PATH") or "").strip()
if raw:
return raw
if os.name == "nt":
drive = (os.environ.get("SystemDrive") or "C:").strip()
return drive if drive.endswith(("\\", "/")) else drive + "\\"
return "/"
def _safe_int(value: Any) -> int:
try:
return int(value)
except (TypeError, ValueError):
return 0
def get_host_status() -> dict[str, Any]:
try:
import psutil
except ImportError:
return {
"ok": False,
"msg": "未安装 psutil,请在 manual-trading-hub 环境执行 pip install psutil",
}
now = time.time()
if not _state["primed"]:
psutil.cpu_percent(interval=None)
_state["primed"] = True
cpu_pct = float(psutil.cpu_percent(interval=None))
cpu_count = int(psutil.cpu_count(logical=True) or 0)
vm = psutil.virtual_memory()
disk_path = _disk_path()
du = psutil.disk_usage(disk_path)
net = psutil.net_io_counters()
sent_rate = 0.0
recv_rate = 0.0
if net is not None and _state["net_ts"] > 0:
dt = max(0.001, now - float(_state["net_ts"]))
sent_rate = max(0.0, (net.bytes_sent - int(_state["net_sent"])) / dt)
recv_rate = max(0.0, (net.bytes_recv - int(_state["net_recv"])) / dt)
if net is not None:
_state["net_ts"] = now
_state["net_sent"] = int(net.bytes_sent)
_state["net_recv"] = int(net.bytes_recv)
disk_total = _safe_int(du.total)
disk_used = _safe_int(du.used)
disk_pct = round(disk_used / disk_total * 100, 1) if disk_total > 0 else 0.0
boot = float(psutil.boot_time())
return {
"ok": True,
"hostname": socket.gethostname(),
"uptime_sec": max(0, int(now - boot)),
"cpu": {
"percent": round(cpu_pct, 1),
"count": cpu_count,
},
"memory": {
"total_bytes": _safe_int(vm.total),
"used_bytes": _safe_int(vm.used),
"percent": round(float(vm.percent), 1),
},
"disk": {
"path": disk_path,
"total_bytes": disk_total,
"used_bytes": disk_used,
"percent": disk_pct,
},
"network": {
"bytes_sent": _safe_int(net.bytes_sent if net else 0),
"bytes_recv": _safe_int(net.bytes_recv if net else 0),
"sent_rate_bps": round(sent_rate, 1),
"recv_rate_bps": round(recv_rate, 1),
},
"updated_at": time.strftime("%Y-%m-%d %H:%M:%S"),
}