style: 报告消息改用 WeCom 友好排版(去表格/彩色高亮/引用块)
This commit is contained in:
@@ -168,9 +168,12 @@ def _check_services() -> dict:
|
||||
|
||||
|
||||
def _mark(pct: float | None, threshold: int) -> str:
|
||||
"""百分比展示:WeCom markdown 不支持表格,超阈值用红色字体高亮。"""
|
||||
if pct is None:
|
||||
return "—"
|
||||
return f"{pct:.0f}%" + (" 🔴" if pct >= threshold else "")
|
||||
if pct >= threshold:
|
||||
return f'<font color="warning">**{pct:.0f}%**</font>'
|
||||
return f"{pct:.0f}%"
|
||||
|
||||
|
||||
@flow(name="device-check", log_prints=True)
|
||||
@@ -188,55 +191,57 @@ def device_check(alarm_threshold: int = 80) -> dict:
|
||||
print(f"[device-check] {name} 检查失败: {err}")
|
||||
|
||||
threshold = alarm_threshold
|
||||
lines = [f"🖥 **设备健康日报** {datetime.now().strftime('%Y-%m-%d %H:%M')}", ""]
|
||||
lines = [f"🖥 **设备健康日报** {datetime.now().strftime('%m-%d %H:%M')}", ""]
|
||||
|
||||
mem = checks.get("memory") or {}
|
||||
if mem:
|
||||
lines.append(f"**内存**: {_mark(mem['pct'], threshold)}({mem['used']}/{mem['total']})"
|
||||
f" | swap {_mark(mem['swapPct'], threshold)}({mem['swapUsed']}/{mem['swapTotal']})")
|
||||
lines.append(f"**内存** {_mark(mem['pct'], threshold)}({mem['used']}/{mem['total']})"
|
||||
f"|swap {_mark(mem['swapPct'], threshold)}({mem['swapUsed']}/{mem['swapTotal']})")
|
||||
else:
|
||||
lines.append("**内存**: 检查失败")
|
||||
lines.append("**内存** 检查失败")
|
||||
|
||||
lines.append("**磁盘**:")
|
||||
lines.append("| 挂载点 | 使用率 | 已用/总量 |")
|
||||
lines.append("| --- | --- | --- |")
|
||||
for d in checks.get("disks") or []:
|
||||
disks = checks.get("disks") or []
|
||||
if disks:
|
||||
lines.append("**磁盘**")
|
||||
for d in disks:
|
||||
if "error" in d:
|
||||
lines.append(f"| {d['label']} | 检查失败 | {d['error']} |")
|
||||
lines.append(f"> {d['label']} 检查失败:{d['error']}")
|
||||
else:
|
||||
lines.append(f"| {d['label']} | {_mark(d['pct'], threshold)} | {d['used']}/{d['total']} |")
|
||||
lines.append(f"> {d['label']} {_mark(d['pct'], threshold)}({d['used']}/{d['total']})")
|
||||
|
||||
lines.append("**GPU**:")
|
||||
gpus = checks.get("gpus")
|
||||
if isinstance(gpus, list) and gpus:
|
||||
lines.append("| GPU | 利用率 | 显存 |")
|
||||
lines.append("| --- | --- | --- |")
|
||||
lines.append("**GPU**")
|
||||
for g in gpus:
|
||||
lines.append(f"| {g['name']} | {_mark(g['utilPct'], threshold)} | "
|
||||
f"{_mark(g['memPct'], threshold)}({g['memUsed']}/{g['memTotal']}) |")
|
||||
lines.append(f"> {g['name']}|利用率 {_mark(g['utilPct'], threshold)}"
|
||||
f"|显存 {_mark(g['memPct'], threshold)}({g['memUsed']}/{g['memTotal']})")
|
||||
else:
|
||||
lines.append(f"> {gpus if isinstance(gpus, str) else '未检测到'}")
|
||||
lines.append(f"**GPU** {gpus if isinstance(gpus, str) else '未检测到'}")
|
||||
|
||||
docker = checks.get("docker") or {}
|
||||
issues = docker.get("issues") or []
|
||||
if docker.get("running") is None:
|
||||
lines.append(f"**Docker**: {issues[0]['issue'] if issues else '不可用'}")
|
||||
lines.append(f"**Docker** {issues[0]['issue'] if issues else '不可用'}")
|
||||
else:
|
||||
lines.append(f"**Docker 容器**: 运行中 {docker['running']}/{docker.get('total', '?')}"
|
||||
+ (f",已停用 {docker['stopped']}" if docker.get("stopped") else "")
|
||||
+ (f",⚠️ 异常 {len(issues)} 个" if issues else ",全部正常"))
|
||||
for it in issues[:10]:
|
||||
lines.append(f"- 🔴 {it['name']}: {it['issue']}")
|
||||
docker_line = f"**Docker** 运行 {docker['running']}/{docker.get('total', '?')}"
|
||||
if docker.get("stopped"):
|
||||
docker_line += f" · 已停用 {docker['stopped']}"
|
||||
if issues:
|
||||
docker_line += f" · 异常 <font color=\"warning\">**{len(issues)}**</font>"
|
||||
else:
|
||||
docker_line += " · 异常 0"
|
||||
lines.append(docker_line)
|
||||
for it in issues[:8]:
|
||||
lines.append(f"> 🔴 {it['name']}:{it['issue']}")
|
||||
|
||||
failures = checks.get("prefectFailures") or []
|
||||
lines.append(f"**Prefect 近24h 失败**: {len(failures)} 个 flow run"
|
||||
+ ("" if failures else " ✅"))
|
||||
for f in failures[:8]:
|
||||
lines.append(f"- 🔴 {f['name']}({f['state']}) {f['start']} {f['message'][:60]}")
|
||||
lines.append(f"**Prefect 失败(24h)** {len(failures)} 个" + (" ✅" if not failures else ""))
|
||||
for f in failures[:5]:
|
||||
lines.append(f"> 🔴 {f['name']}({f['state']}){f['start']}")
|
||||
|
||||
svc = checks.get("services") or {}
|
||||
lines.append(f"**服务探活**: OCR {'✅' if svc.get('ocr') else '🔴'} | "
|
||||
f"PG {'✅' if svc.get('pg') else '🔴'} | 负载 {os.getloadavg()[0]:.1f}")
|
||||
lines.append(f"**探活** OCR {'✅' if svc.get('ocr') else '🔴'}|PG {'✅' if svc.get('pg') else '🔴'}"
|
||||
f"|负载 {os.getloadavg()[0]:.1f}")
|
||||
|
||||
alarms = (
|
||||
(mem and (mem["pct"] >= threshold or mem["swapPct"] >= threshold))
|
||||
@@ -244,7 +249,8 @@ def device_check(alarm_threshold: int = 80) -> dict:
|
||||
or (isinstance(gpus, list) and any(g["utilPct"] >= threshold or g["memPct"] >= threshold for g in gpus))
|
||||
or bool(issues) or bool(failures) or not svc.get("ocr") or not svc.get("pg")
|
||||
)
|
||||
lines += ["", ("🔴 **有项目需要处理,见上**" if alarms else "✅ **一切正常**")]
|
||||
lines += ["", ('<font color="warning">🔴 **有项目需要处理,见上**</font>' if alarms
|
||||
else '<font color="info">✅ **一切正常**</font>')]
|
||||
|
||||
content = "\n".join(lines)
|
||||
sent = send_markdown(content)
|
||||
|
||||
Reference in New Issue
Block a user