TT Lab
开始
学习 学习路径 课程

Grafana — 仪表盘是一个问题

要让「绿色就没事」成为事实

在 TT Lab 中继续学习

一句话总结

“绿色就没问题”这个承诺,只有在能说清这个绿色意味着什么的时候才成立。没有依据的阈值什么也不说,却让所有人都安心。

为什么需要它

在 Grafana 中创建面板时,阈值已经在里面了。官方文档写明的默认值是这样的——基线(Base)为绿色,从 80 起为红色,方式为绝对值。这个 80 是从哪里来的?哪里也不是。因为很多人使用的是像 CPU 使用率这样 0 到 100 之间的值,于是设定了这个便利值。

问题在于,这个便利值会原样留在我们的指标上。用 PromQL 得出的错误比率在 0 到 1 之间。如果这个面板带着 80 的红色阈值,即使服务让 100% 的请求都失败,值也只是 1,达不到阈值。这个面板永远是绿色的。界面每天都在说“没问题”,只是从来没有人问过这句话是什么意思。

Grafana 默认阈值是基线绿色、从 80 起红色,而错误比率只在 0 到 1 之间变化,因此该面板永远是绿色的样子,与由 30 天目标 99.5% 得出错误预算 0.5%、在 0.005 和 0.01 处计算并放入阈值使颜色有了意义的样子的对比

反方向的情况也很常见。有人说着“红色出现得太频繁了”,悄悄把阈值调高。因为没有依据,调低也没有依据。阈值一旦成了情绪的旋钮,从那以后就是界面在驯化人。

工作原理

阈值不在图上,而在仪表板模型中。fieldConfig.defaults.thresholds 之下有方式(mode)和档位列表(steps),每个档位有颜色和值。最前面那个档位的值是空的,它就是文档所说的基线——负无穷。Grafana 会把档位按值排序,然后选择值大于等于该档位的最后一个档位的颜色。边界是包含的。如果阈值是 0.005,那么 0.005 已经是该颜色,而 0.00499 是前一个颜色。

由此产生两条规则。第一,档位是以“越低越好”为前提写出的——值越大,就越往坏的颜色走。所以对于像剩余磁盘或成功率这样越大越好的指标,必须把顺序反过来:基线设为红色,越往上越是绿色。如果不反过来,磁盘完全空了的状态会显示为绿色。第二,档位之间没有空隙。任何值都必然有一个颜色。

方式有两种。绝对值是把值本身与阈值比较。百分比是比较值在最小值与最大值之间处于百分之几的位置。所以百分比阈值离开标准选项中的 Min、Max 就没有意义——这就是文档把 Min 和 Max 写成“用于计算百分比阈值的值”的原因。要用百分比给剩余磁盘着色,就必须把卷的总大小填为最大值;如果不填这个数字,Grafana 会从当前界面上的数据猜测最大值。那样,同一个面板每次改变时间范围,颜色都会不同。

确定阈值时,唯一能够解释的依据,是我们对用户做出的承诺。如果 30 天可用性目标是 99.5%,那么错误预算就是 0.5%,只要错误比率超过 0.5%,消耗预算的速度就恰好快于预算速度。于是,警告设在 0.005,红色设在它的两倍 0.01,这样阈值就是算出来的。这样制定的阈值可以在会议上辩护,目标改变时它也随之改变。

只靠颜色说话的界面还会带来另一个问题。对色觉异常的人来说,红色和绿色无法区分,在黑白打印的复盘资料中也一样,还有些工具会把告警截图保存为黑白。所以颜色应当是附加的信号,必须先有数值和文字。在 Grafana 中,可以用值映射的 Range 规则,为每个区间加上文字。比如从 0 到 0.005 是“正常”,其上是“预算消耗中”。映射从上往下扫描,第一个命中的规则胜出,并且两端都包含,所以边界值重叠时,前面的规则会取走它。

最后是界面与呼叫之间的错位。如果面板的红色在 0.01,而告警规则在 0.02 才响,那么在错误比率为 0.015 的时间里,仪表板一片通红,却没有人被呼叫。事故复盘时问“为什么没有人知道”,得到的回答是,这两个数字是手工写在不同文件里的。修正的方法是从同一个地方取得这两个数字。在目标文件里只写一次数字,面板和规则都由它生成,错位的地方就不存在了。

这个环境无法判定的内容也要说清楚——实际涂出来的颜色。这个 Pod 中的 Grafana 没有图像渲染器插件,无法把面板导出为图像。所以评分器只看阈值模型和查询结果。哪个值会成为哪种颜色,可以按 Grafana 使用的规则原样计算来确认,但那个红色在界面上是否显眼、是否会与旁边面板的绿色混淆,则无法确认。这需要通过网页预览打开 3000 端口,由人来看。

在现场相遇的样子

有一个团队的支付仪表板,六个月里一次也没有变红过。这个事实还经常被引用为值得信赖的依据。有一天,有人打开面板 JSON,发现阈值是 80。而那个面板的值在 0 到 1 之间。六个月里,那个绿色并不是“没问题”,而是“什么也没说”。

在另一个团队里,磁盘仪表盘不是从红色开始、到绿色结束,而是反过来配置的。剩余容量为 90% 时是红色,为 5% 时是绿色。没有人说这很奇怪,因为那个面板一直是绿色。

下一项实验要做什么

启动 Grafana,创建一个保持默认阈值的面板,亲自计算这个阈值对我们的指标来说是不是可以达到的值。接着从目标文件中取出错误预算,把算出的阈值放进去,并用 Grafana 的规则确认当前值是哪种颜色。分别使用绝对值阈值和百分比阈值,看看最小值、最大值为什么必要,并用值映射让它在颜色之外也用文字说话。制作一个用六个边界值确认阈值顺序和包含规则的小工具,并把已经在生产环境中运行的告警规则的阈值与面板阈值,改成从同一个值取得。最后,拿到一个含有四个阈值缺陷的生产仪表板,全部修正并提交。