Grafana中如何获取多个Prometheus时序最新非空值的最大值
解决方案
步骤1:调整单查询PromQL,预先取最新非空值
不需要修改查询结构、也不需要合并多个查询,只需要给每个原PromQL套一层last_over_time函数,直接在Prometheus侧返回对应时序的最新非空值,避免全量时序拉取到Grafana后出现时间对齐错位问题:
# 原查询替换为如下格式,时间范围设置为大于你最长的采集间隔即可,比如采集间隔最大为1分钟则设为2m last_over_time(你的原指标查询表达式[2m])
如果单个查询会返回多台服务器的时序,可以加聚合保留实例维度:
max by (instance) (last_over_time(你的原指标查询表达式[2m]))
这个调整性能损耗极低,last_over_time是Prometheus原生优化的轻量函数,反而比拉取全量时序到Grafana处理性能更高。
步骤2:配置Grafana转换规则
按顺序添加3个转换即可得到符合预期的最大值:
- 第一个转换选减少(Reduce):模式选择「系列到行」,计算规则选择「最后一个非空值」,作用是把所有查询返回的最新值全部合并到同一行的不同字段中,不会因为采集时间差异出现空值
- 第二个转换选从计算添加字段(Add field from calculation):模式选择「减少行」,计算规则选择「最大值」,计算所有服务器最新值的最大值
- 第三个转换选组织字段(Organize fields):仅保留上一步生成的最大值字段,隐藏其他字段,即可直接绑定到Gauge面板展示
按照上述配置,你的示例数据会固定取到10(server1最新值)、26(server2最新值)、23(server3最新值)的最大值26,不会因为采集时间错位出现最大值跳变到23的问题,也不会取到历史最高值49。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

