关于Grafana告警总是NO_DATA的一个坑
- 监控
- 2022-08-26
- 21热度
- 0评论
背景
运维每天总是要在生产库执行一堆SQL来做数据检核,有问题数据了就执行处理,需要把sql都执行一遍后一个个查看是否存在问题数据,耗时费力。
引入 oracledb_exporter+prometheus+grafana 来执行查询sql的自动执行,并判断是否存在问题数据,发送钉钉或者邮件告警通知。
使用的 Grafana 的告警功能,总是提示 NO_DATA,如下图,实际去grafana面板查看,是0条数据ok的或者是存在问题数据应该提示具体的问题数量的:
问题定位
Condition中的条件配置的是查询最近一个小时内的最后一条数据,如果大于0,则触发告警
通过调用下面的 TestRule 发现,时而提示 Alerting 时而提示 No_data
查看 grafana 后台,发现 TestRule 的请求中,传过去的 Start 时间为 当前时间1小时前的时间(localtime),但是 End 时间传的是当前时间往前8小时的时间(UTC)的时间。这应该是 grafana 的一个bug,时区没匹配好。
解决方法
Condition 改为 now-1h,now ,统一都弄成 UTC 的时间去发送请求。
解决后又发现一个问题,还是会报 NO_DATA ,因为数据采样频度导致的
上图时间我统一配置的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/