专业书籍精读 · SRE · 第 10 章

基于时序数据的实用告警

Site Reliability Engineering · Ch 10 · Google · 2016

EN →

这一章讲什么?

你半夜下单、刷视频都能用,是因为有人在值班——手机响了就起床救火。这一章讲的不是「怎么救」,而是那个电话到底该在什么时候响:Google 怎么把几十万台机器上密密麻麻的数字,变成一条「现在必须叫人」的判断。

先说个怪事

你大概以为做监控最难的是发现问题。真实世界里最难的是别乱响。一个响了一百次、九十九次没事的报警器,第一百次真出事时,值班的人已经学会不理它了——不是他懒,是人对狼来了就这个反应。所以这一章真正在解决的问题是:怎么让电话少响,还不漏掉真事。

旧世界为什么难

早年的监控像给每台机器装一个烟雾报警器:挨个问「你 CPU 高不高」「磁盘满没满」,谁超标谁喊。机器少的时候挺好,几千台之后就两头不讨好——一次例行重启能让上百个报警器同时叫(其实没人受影响),而真正的坏事又常常单看每一台都「正常」:每台只有百分之一的请求出错,加起来却是一大批用户点不开页面。更要命的是这种报警器只会说「现在超标了」,问不了「上周同一时刻是多少」「这条线照这个斜率多久会撞墙」。

它是怎么做到的

换了个思路:不让机器自己判断好坏,只让它们报数。

每个程序在自己门口挂一块小黑板,上面写着「我一共收了多少请求」「其中多少出错」「现在有多少人在排队」这类计数。监控系统每隔十秒挨家挨户去抄一遍,抄下来的不是「好/坏」,而是一串随时间变化的数字——像体温记录表,不是一句「他病了」。

抄回来的每条记录还挂着几张标签:哪个服务、哪个机房、哪台机器。于是「要不要叫人」就变成了对这些记录做算术:先把同一个服务几千台的数字加在一起(不再一台台看),再算成比例(出错的占总数的百分之几,这样机器多机器少都能比),最后加一条「得连续超标五分钟」——抖一下就自己好了的,压根不该叫人。

这一步的妙处在于:同一份抄来的数据,既能用来打电话,也能画成曲线看趋势,还能在排查时回头问「昨天这个点长什么样」。判断从「哪台机器不舒服」挪到了「用户是不是真的受影响了」。

代价是什么

抄数字太便宜了,于是大家什么都抄:几年后曲线多到没人说得清哪条真有人在看,而存这些曲线的开销、和翻找它们的成本,反倒成了新的麻烦。

一句话记住

好的告警不是「阈值设得准」,而是先把世界记成可以做算术的曲线,再让「该不该叫人」成为这些曲线上的一道算式——算式可以被审阅、被改、被复用,而一万个散落的阈值不能。

想看 /varz 埋点、标签时序、速率与比率的规则代数和示意图? → 切到精读版