如何使用Prometheus max函数且保留指标名称与标签?
解决Prometheus聚合后丢失指标名称与标签的问题
问题原因
Prometheus的聚合函数(如max())默认会丢弃所有标签(除非显式指定保留规则),同时原指标名称会被替换为聚合函数名(比如max),导致你看不到原指标名和标签。
解决方案
1. 保留指定标签
使用by子句明确列出需要保留的标签,同时用=~匹配多种mode值替代or,让查询更简洁:
max(sys_cpu_host_seconds_total{mode=~"sys|user"}) by (instance, mode)
这里by (instance, mode)表示聚合时保留instance和mode标签,你可以根据实际需求调整要保留的标签列表。
2. 恢复原指标名称
如果需要还原原指标名称sys_cpu_host_seconds_total,可以用label_replace()函数给结果添加__name__标签:
label_replace( max(sys_cpu_host_seconds_total{mode=~"sys|user"}) by (instance, mode), "__name__", "sys_cpu_host_seconds_total", "", "" )
这个函数的作用是将聚合结果的__name__标签设置为原指标名,最后两个空字符串表示不依赖其他标签匹配,直接设置。
补充说明
- 用
mode=~"sys|user"替代sys_cpu_host_seconds_total{mode="sys"} or sys_cpu_host_seconds_total{mode="user"}是PromQL的最佳实践,避免重复书写指标名。 - 如果想保留所有标签(除了聚合时自动丢弃的),可以用
without()子句,但需要明确排除不需要的标签,不过by子句更直观可控。
内容的提问来源于stack exchange,提问作者stevew
相关产品推荐
相关产品推荐

