监控经常会被理解成上线前补齐的三件套:日志、指标、链路。
但我现在越来越觉得,可观测性的起点不是先接什么工具,而是先承认一件不太舒服的事:
我现在对系统的判断,很可能是错的。
我以为 MQTT 还连着,实际连接早就假死了;
我以为任务还在跑,只是数据库里的状态没更新;
我以为设备离线,最后发现断的是中间转发;
我以为规则没触发,查到后面才发现告警已经产生了,只是设备标识没对上。
如果系统只告诉我们“成功”或者“失败”,其实没什么用。它只是把我们的判断又重复了一遍。
真正有用的信息,应该能让后来排查的人推翻原来的结论。
比如记录设备离线,不要只写一句:
设备离线
更应该把判断依据留下来:
last_message_at=...
check_at=...
source=mqtt
“设备离线”是结论,后面这些才是证据。
任务状态不能只有 running,还要有最后更新时间;重试不能只说失败,要记录重试次数和最近一次错误;跨服务请求也要有统一的 request_id,方便一路追下去。
这样当“页面显示不对”时,大家不用各自凭感觉猜:前端觉得是接口问题,后端觉得是数据问题,采集侧觉得是设备问题。我们可以顺着证据重新算一遍:这个状态是怎么来的,在哪一层变了,哪个判断条件不成立。
可观测性的价值,是在问题发生以后,让我们以最小的时间和精力成本更快更可靠的接近事实。