如何在Grafana中基于InfluxDB实现类Prometheus死信开关告警
监控InfluxDB桶数据上报的Grafana告警配置方案
一、调整Flux查询适配告警场景
原仪表盘查询针对时间范围取数据,但告警需要检查最近12小时是否有数据上报,需修改查询逻辑,把无数据的情况转换成明确的可判断值,避免空结果导致告警无法触发:
// 获取最近12小时内的目标数据最后一条记录的时间 data = from(bucket: "<bucket_name>") |> range(start: -12h) |> filter(fn: (r) => r["_measurement"] == "°C") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["domain"] == "sensor") |> filter(fn: (r) => r["entity_id"] == "<entity_id>") |> last() |> keep(columns: ["_time"]) // 有数据返回1,无数据返回0,给告警规则提供明确判断依据 exists = if exists data then 1 else 0 yield(name: "data_exists", value: exists)
二、创建Grafana告警规则
- 进入Grafana的Alerting > Alert rules,点击Create alert rule
- 选择Query类型数据源,粘贴上述修改后的Flux查询
- 配置告警表达式:
- 选中查询结果
data_exists,设置条件为IS 0(代表最近12小时无数据) - 评估周期设为1小时(可根据需求调整,避免过于频繁检查)
- 触发条件保持
For: 0m,若需避免临时网络波动误报,可设为5分钟
- 选中查询结果
- 配置通知:
- 在Notifications板块选择已配置的邮件通知渠道(未配置的话先去Alerting > Contact points创建邮件联系人)
- 设置告警标题与消息,例如:
告警:<entity_id>传感器已12小时无数据上报
三、无数据场景的处理逻辑
Grafana告警对空查询结果的支持不佳,所以必须把无数据的情况转换成明确数值(比如上述方案里的0)。也可以用统计数据点数量的方式实现相同效果:
from(bucket: "<bucket_name>") |> range(start: -12h) |> filter(fn: (r) => r["_measurement"] == "°C") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["domain"] == "sensor") |> filter(fn: (r) => r["entity_id"] == "<entity_id>") |> count() |> yield(name: "data_count")
此时告警表达式设置为data_count IS 0即可。
内容的提问来源于stack exchange,提问作者Thanos Mourtzoukos
相关产品推荐
相关产品推荐

