通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)
内容提要
本文介绍了使用Prometheus进行集群巡检的方法,包括使用PromQL查询语言获取数据和修改告警中的PromQL。还提供了一个巡检脚本示例,并强调巡检脚本编写是长期工作。
延伸解读
巡检与告警的本质差异
文章指出,告警仅基于当前数据判断是否达到临界值,而巡检需要分析一段时间的历史数据来发现潜在隐患。这种差异决定了不能直接套用告警规则,必须对PromQL进行改造,引入时间聚合函数,使查询覆盖更长时间范围,从而提前识别风险。
PromQL改造的关键:时间聚合与子查询
为了获取历史数据的最大值,作者使用max_over_time函数,并结合子查询语法(如[24h:1m])实现按步长回溯查询。同时强调,若原告警查询的时间范围是5分钟或10分钟,子查询步长也应保持一致,以确保覆盖完整时间段且避免重复计算。
脚本使用注意事项与扩展方向
脚本执行前需预先编写好PromQL,一次性巡检天数过多可能导致Prometheus报错,需关注错误信息。目前脚本仅基于Prometheus数据,未来可纳入表健康度、慢SQL、日志等DBA常查但Prometheus未覆盖的信息,巡检脚本的完善是长期工作。
Q&A
为什么不能直接用 TiDB 的告警来做集群巡检?
告警只基于当前数据进行判断,而巡检需要基于一段时间的历史数据来排查隐患。告警是已经达到临界值才触发,巡检则是要提前发现风险,避免异常发生。
PromQL 和 SQL 有什么区别?
PromQL 是一种嵌套的函数式查询语言,需要把要查找的数据描述成一组嵌套的表达式,每个表达式评估为中间值,并作为上层表达式的参数,最外层表达式返回最终结果。而 SQL 是像 SELECT * FROM ... 这样的查询语言。
在 PromQL 中,rate 和 irate 函数有什么不同?
rate() 用于计算指定时间范围内计数器平均每秒的增加量,容易陷入长尾问题,无法反映突发变化。irate() 则计算瞬时增长率,灵敏度更高,能反映时间窗口内样本数据的突发变化。
如何修改告警中的 PromQL 使其适用于巡检?
可以使用 max_over_time 等时间聚合函数获取历史数据的最大值。例如,将原告警中的 sum(rate(...)) 改为 max_over_time(avg(rate(...)) by (instance)[24h:1m]),这样就能获取过去 24 小时内每分钟执行一次查询后的最大值,满足巡检基于历史数据判断的需求。
巡检脚本中如何设置查询的时间范围和步长?
在 PromQL 中使用子查询语法 [<duration>:<step>] 来指定时间范围和步长。例如 [24h:1m] 表示过去 24 小时内每分钟执行一次查询。步长应与原告警中数据采集的时间范围保持一致,以避免重复计算和资源浪费。
巡检脚本开源在哪里?如何获取?
巡检脚本已在 Gitee 上开源,链接为:https://gitee.com/mystery-cyf/prometheus--for-inspection/tree/master。欢迎社区贡献更多巡检项。