核心概念 早期试点
见证只有一个差异点:证据强度是一等字段。 每个组件的版本和健康都必须附带来历,界面必须把来历显示出来。
部署与组件
部署是我们受托运维的一套系统,其中可以一个 Lurus 产品都没有。
组件是观测的最小单位。它不等于「我们的某个产品」——可以是一个服务、一个开源数据库、一个 nginx 站点、一个静态目录,或一张证书。组件类型是开放字符串,界面遇到不认识的类型必须照常显示,不得隐藏。
每个部署还带一个关系标签:internal(自有环境)、managed(受托运维的客户环境)、self_hosted(客户自持,汇聚服务在客户网络内)。
版本从哪来:version.source
版本号从不单独出现,总是和来源成对。
| 取值 | 界面文案 | 含义 |
|---|---|---|
self_report | 版本来自服务自报 | 组件自己公布的版本,可比对 |
image_tag | 版本来自镜像标签 | 从部署所用镜像的标签读出;说明「部署了什么」,不说明容器里实际在跑什么 |
blackbox_inferred | 版本为黑盒推断 | 从外部特征推测;不能用来判断「升级了没有」 |
unknown | 版本未知(组件不自报) | 显示为 ?,绝不显示成 latest |
两条写进代码的规则
- 哨兵值不是版本。 组件返回
unknown、dev、unset、n/a、none、null这类字面量时,一律降级为unknown,值置空。否则一个占位字符串会在卡片上被渲染成可比对的真版本。 - 版本号别做字符串比对。 不同组件的版本格式天生不同:有的是裸提交号,有的带分支前缀,有的按镜像摘要固定、根本没有可读标签。「两个字符串不一样」不等于「升级失败」。
健康从哪来:health.evidence_class
| 取值 | 界面文案 | 怎么来的 | 强度 |
|---|---|---|---|
introspected | 健康来自自省实证 | 组件自己的健康 / 就绪接口回答了 | 最强 |
host | 健康来自宿主证据 | 在它所在的主机上看到的:容器状态、服务单元、磁盘用量、备份文件时间、编排控制器的副本数 | 中 |
blackbox | 健康为黑盒推断 | 只有外部可见信号:HTTP 状态码、证书到期日、端口是否接受连接 | 最弱 |
黑盒推断的「正常」只证明能连上,不证明功能对。
「连不上」不是自省
就绪接口返回 503,是自省实证——组件自己回答了「我没就绪」。连接失败则不是:我们只知道连不上,证据降级为 blackbox。把后者标成 introspected,等于声称我们并不拥有的证据。
五个状态词
状态是五值的。其中两个值存在的意义,是阻止仪表盘最常见的那种撒谎。
| 状态 | 意思 | 对客户怎么说 |
|---|---|---|
正常 ok | 按当前证据看是好的 | 「按【证据强度】看是正常的」——把证据强度念出来 |
降级 degraded | 在响应,但没达到应有的样子 | 「在服务,但有异常,正在确认」 |
故障 down | 有明确证据表明它不工作 | 「确认异常,已升级处理」 |
未知 unknown | 我们的探针没测到 | 「我们这条测不到,正在恢复观测能力」——不要说客户系统坏了 |
陈旧 stale | 读数超过判定窗口,太旧不能用 | 「这条读数太旧不能用,正在恢复」——不要说一切正常 |
未知和陈旧都不是故障,也都不是正常。它们是「不知道」。
未知 ≠ 故障
宿主类探针的命令失败、超时或输出解析不出来,结果一律是 unknown,绝不是 down。down 必须来自证据,比如容器报已退出、服务单元报失败、备份目录里一个匹配文件都没有。把探针自己的故障渲染成红色,会让人分不清「目标真的挂了」和「我们连不上目标」。
陈旧 ≠ 正常
这是整个产品承重的一条规则。
- 判定窗口
TTL = max(3 × 上报间隔, 180 秒),默认上报间隔 60 秒。连续漏掉两次上报仍可容忍,第三次就承认不知道。 - 超过窗口的组件一律显示为「陈旧」,不得沿用上一次的绿色。
- 窗口按部署各算各的:每分钟上报的主机和每小时上报的机器可以出现在同一屏上。
- 时间戳超前于服务端时钟、且超前幅度超过判定窗口的,也按陈旧处理:对不上的时钟不能用来声称数据新鲜。超前 5 分钟以上的快照在入库时直接拒收。
为什么要在两端各判一次
陈旧判定在服务端做一次,在大屏 / 手机端用本机时钟再做一次,取更悲观的结论。
| 故障 | 谁能发现 |
|---|---|
| 采集器不再上报 | 服务端 |
| 汇聚服务自己卡死 | 只有客户端 |
| 中间缓存重放旧响应 | 只有客户端 |
两端的常量(上报间隔、窗口下限、契约版本)由测试对照比对,漂移即失败。
推送通知
状态转移时可以推一行文本到你指定的通知地址。
- 会推:组件从正常或降级变为故障、从故障恢复为正常、首次观测即为故障、采集器离线 / 恢复。同一状态连续不重发。
- 不推:陈旧(离线已由「采集器离线」覆盖)、从故障变为降级、首次观测为降级、首次观测为未知。
- 推送是尽力送达,不会拖慢入库。每条已派发的通知可以落一行留档,包括没送到的那些。
所以,手机没响不代表一切正常,只代表上面那几件事没有发生。