基于Graphite分组/通配符的Seyren告警目标函数百分比计算
嘿,我正好折腾过类似的Graphite+Seyren告警配置,给你一步步拆解怎么实现这个需求哈!
一、先搞定Graphite的核心查询逻辑
首先得假设你的指标结构大概是stats.page_render.{placement_id}.{page_version}.count(如果不是的话,后面替换成你实际的路径就行),核心思路是把当前渲染计数和前一天同组合的平均值做百分比对比,再筛选出不达标的指标。
1. 取当前的渲染计数
用keepLastValue来获取每个placement_id+page_version组合的最新数值,同时用*匹配所有组合:
keepLastValue(stats.page_render.*.*.count)
2. 计算前一天的日均平均值
这里要用到shift把数据偏移一天(拿到前一天的同期数据),再用movingAverage计算这一整天的平均值:
movingAverage(shift(stats.page_render.*.*.count, 1d), 1d)
3. 算出当前值占前一天平均值的百分比
把两个结果做除法再乘100,得到百分比:
divideSeries(keepLastValue(stats.page_render.*.*.count), movingAverage(shift(stats.page_render.*.*.count, 1d), 1d)) * 100
4. 筛选出低于阈值的指标
比如你设定的阈值是70%,就用below函数把所有百分比低于70的组合筛出来:
below(divideSeries(keepLastValue(stats.page_render.*.*.count), movingAverage(shift(stats.page_render.*.*.count, 1d), 1d)) * 100, 70)
二、Seyren这边的告警配置
- 新建一个告警,把上面最终的Graphite查询粘贴进去
- 告警触发条件:因为我们已经用
below筛出了不达标的指标,所以只要查询返回至少1个指标,就触发告警(Seyren里可以设置当返回系列数>0时触发) - 通知配置:记得在通知模板里带上指标名称,这样你能一眼看到是哪个
placement_id+page_version出问题了 - 检查间隔:根据你的数据采集频率调整,比如5分钟检查一次,避免太频繁误报,也别太松错过问题
三、避坑小贴士
- 如果前一天某个组合没有数据,
movingAverage会返回null,除法就会出错。可以用keepLastValue包裹平均值部分,或者用ifNull给空值设个默认值(比如ifNull(movingAverage(...), 1),不过要注意默认值会不会导致误报) - 先在Graphite的Web界面测试查询,找一个已知低于前一天平均值的组合,看看能不能被正确筛选出来,确认逻辑没问题再配置Seyren
- 如果你的指标路径里
placement_id和page_version的位置不一样,记得把*挪到对应的位置哦
内容的提问来源于stack exchange,提问作者user1804548
相关产品推荐
相关产品推荐

