关于Grafana告警总是NO_DATA的一个坑

背景

运维每天总是要在生产库执行一堆SQL来做数据检核,有问题数据了就执行处理,需要把sql都执行一遍后一个个查看是否存在问题数据,耗时费力。

引入 oracledb_exporter+prometheus+grafana 来执行查询sql的自动执行,并判断是否存在问题数据,发送钉钉或者邮件告警通知。

使用的 Grafana 的告警功能,总是提示 NO_DATA,如下图,实际去grafana面板查看,是0条数据ok的或者是存在问题数据应该提示具体的问题数量的:

file

问题定位

Condition中的条件配置的是查询最近一个小时内的最后一条数据,如果大于0,则触发告警
file

通过调用下面的 TestRule 发现,时而提示 Alerting 时而提示 No_data
file

查看 grafana 后台,发现 TestRule 的请求中,传过去的 Start 时间为 当前时间1小时前的时间(localtime),但是 End 时间传的是当前时间往前8小时的时间(UTC)的时间。这应该是 grafana 的一个bug,时区没匹配好。

解决方法

Condition 改为 now-1h,now ,统一都弄成 UTC 的时间去发送请求。

解决后又发现一个问题,还是会报 NO_DATA ,因为数据采样频度导致的
file
上图时间我统一配置的10分钟,则 prometheus 会根据这个采样频度,在Condition配置的时间区间中去匹配,把此时间区间按10分钟进行分割,那分割点去匹配采样数据的时间序列,匹配到的时间点的数据返回。因为10分钟跨度较大,有时匹配不到采样点,就返回没有数据。
解决方法,如上图,将 min step 调小,也可以在 grafana 的数据源配置中统一设置默认值Scrape interval

参考

https://blog.csdn.net/iceman1952/article/details/120147853
https://prometheus.io/docs/prometheus/latest/querying/examples/