跳转至

机队状态监控:语义与陷阱

后台的"设备在线状态"看着简单,实际有两类坑会让人误判: 身份错(一台机器两个名字)与静默兜底(解析失败被当成永远离线)。

状态灯的语义

控制台的颜色由"最近一次上报时间 + 运行状态"决定:

颜色 条件 含义
🟢 绿 阈值内有上报 且 state == ready 在线且就绪
🟡 黄 阈值内有上报,但状态不是 ready 在线但非就绪(如 shutdown)
🔴 红 超过阈值没有上报 离线

所以黄色不等于故障,绿色也不等于能打印 —— 要结合 print_stats.state 判断。

坑一:身份错(一台机器两个名字)

现象:云端只看到一台设备在报,另一台永远红灯。

实际原因:设备端的主机名/标签还是占位符(PRINT_NAME 这类未展开的模板值), 于是一台真机以两个身份出现在后台:

  • 身份 A:占位符 → 一直在报(其实是同一台机器)
  • 身份 B:kali-<hash> 的历史身份 → 早已不存在 → 永远红灯

判断方法:把身份与实际网络地址对起来查(ARP / ping / SSH),而不是只看后台标签。

根治:金镜像 firstboot 必须生成 kali-* 主机名,并确保 agent 侧 label 模板被正确展开。

坑二:静默兜底(最危险的一类)

try:
    secs = parse(report_time)
except Exception:
    secs = 10**6      # ← 解析失败 = 判为"永远离线"

这种写法的问题:任何字段改名 / 时间戳格式变化,都会让全场设备一起变红, 而且从界面上完全看不出原因是"解析失败"。

正解:解析失败要显式区分成"时间未知",而不是折算成一个巨大的离线秒数。

排查清单

  1. 比较上报条数与上报时间:真在线设备的最后一条应该很近
  2. 查 agent 版本:老版本可能上报字段不完整
  3. 把身份与实际 IP 对应起来,确认有没有幽灵身份
  4. 看 state 字段是不是 ready(黄色多半是这个)

相关