如何按可变指定标签值对Prometheus指标聚合求和
Prometheus按指定标签值筛选求和方案
核心实现逻辑
使用PromQL的标签正则匹配运算符=~筛选指定标签值,配合sum聚合函数完成求和,可通过label_replace自定义返回结果的指标名。
针对初始需求(筛选label1为abc、def、jkl求和)
直接执行以下查询即可返回指标名为custom_metric_groupped、值为num1 + num2 + num4的结果:
label_replace( sum(custom_metric{label1=~"abc|def|jkl"}), "__name__", "custom_metric_groupped", "", "" )
灵活调整筛选值的方法
你只需要修改大括号内label1=~后面的正则枚举内容即可,多个待匹配的标签值之间用|分隔,不需要改动其他语法。
例如后续需要改为仅筛选label1为def、jkl的指标求和,直接将语句修改为:
label_replace( sum(custom_metric{label1=~"def|jkl"}), "__name__", "custom_metric_groupped", "", "" )
注意事项
=~是完全匹配模式,直接用|分隔目标值即可,不要随意添加.*等通配符,避免误匹配到包含目标字符串的其他标签值。这种正则枚举的写法比多个or条件拼接维护成本低很多,增删筛选值只需要改动|分隔的列表即可,不需要调整整体语句结构,非常适配需要频繁调整筛选值的场景。- 如果待匹配的标签值本身包含正则特殊字符(如
.、*、|、(等),需要用双反斜杠\\转义后再写入正则,例如标签值为a.bc时要写为a\\.bc。 - 如果后续需要按其他维度分组求和,只需要在
sum后加by(待保留的标签名)即可,例如需要按label2维度分组求和时,聚合部分写为sum by(label2) (custom_metric{label1=~"abc|def|jkl"})。 - 如果搭配Grafana等可视化平台使用,可以将待筛选的标签值配置为多选变量,平台会自动将选中的多个值用
|拼接传入查询,无需手动修改语句。
内容的提问来源于stack exchange,提问作者agupta66
相关产品推荐
相关产品推荐

