使用 Grafana + Graphite 进行数据预警监控

向 Graphite 写入数据

Graphite 的数据主要以 whisper 的格式存储在 carbon 这个组件中,而向其中填充数据的话我们有多种方式,这里演示两种常用手段。

使用 python

1
$ pip3 install graphyte

这里使用了 graphyte,用法很简单,只需要指定写入的 series 对应的值即可,写入的时间戳与 tag 是附加选项,可写可不写。

1
graphyte.send(series, value, timestamp, {'tag_name': tag_value, 'tag_name': 'tag_value'})

使用 curl

1
$ echo "foo.bar 3 `date +%s`" | nc 127.0.0.1 2003

当数据准备好了之后便按你的喜好来设置图形的样式

设置预警

进入到 Grafana 中的 Alert 标签下,主要需要设置以下几个参数

  1. Alert Config
  2. Conditions

如果想在设置的阈值触发时发送消息通知,则需要进一步设置 Notifications 以及 Alert RulesNotification channels

Alert Config

主要关注 Evaluate every 这个选项

我猜想 Grafana 的开发团队对它的定义为时效性高的预警通知工具,对于数据异常的及时发现,对比的间隔时间显然是越短越好。

它们希望你将比对的时间间隔缩短,30s、60s、120s,这样发现数据异常的速度也就越快。

今年年初,开发者在一条 issue 下做过这样一个答复

torkelo: you cannot control what time of day it will evaluate, it will evaluate every 24 hours. So if it was more than 24 hours since last evaluation it will evaluate (no matter what time of day)

所以,grafana 对小时级、天级或在精确时间点触发预警的支持是很不友好的

例如,你想让你的数据在每个整点触发一次数据比对,至少在当前的最新版本(v5.4.2),都是不支持的。

而在 Evaluate every 的配置下,你也无法保证它的执行时间

举个栗子,你做了这样的设置

1
Evaluate every: 1h

设置了 1h 的执行间隔,那当这次告警对比结束后,它会在下一个告警周期中的不确定时间开始新的告警对比

也就是说,假设 Grafana 在 10:00 的时候执行了一次,你期待它下次执行时间为 11:00,然而现实是它会在 10:00 ~ 11:00 间的任意时间执行,提前执行。

如果你想到了,那就能早早更改策略,如果想不到,那也开心下,毕竟生活处处是惊喜。

Conditions

1
avg() OF query(A, 15m, now) IS BELOW 14

预警阈值主要就是在这里设置,解释下上面的表达式:

A 线的 15 分钟前至当前的平均值,如果小低于 14,则触发报警。

Q&A

我想计算当前与过去七天平均值的增减幅?

思路是对过去七天的数据取平均值,再来与当前时间比对,但是由于 Graphite 并没有让 series 与常数做计算的函数,所以我们只能用另一种精妙的方式曲线救国。

计算增减幅的公式为:(当前 - 过去)/过去 => 当前/过去 - 1

所以我们只需要画一条当前与过去的比值,再在 Conditions 的阈值中设置预期值 + 1 即可

例如,我们想在增幅超过 50% 减幅超过 30% 时触发告警通知,那么使用 asPercent 函数便可计算出当前占用过去的比率,再在 Conditions 中进行这样的配置:

1
avg() OF query(C, 15m, now) IS OUTSIDE RANGE 70 to 150