如何在 Prometheus 查询中对标签进行分组?
Posted
技术标签:
【中文标题】如何在 Prometheus 查询中对标签进行分组?【英文标题】:How can I group labels in a Prometheus query? 【发布时间】:2017-12-22 15:01:12 【问题描述】:如果我有一个带有以下标签的指标:
my_metricgroup="group a" 100
my_metricgroup="group b" 100
my_metricgroup="group c" 100
my_metricgroup="misc group a" 1
my_metricgroup="misc group b" 2
my_metricgroup="misc group c" 1
my_metricgroup="misc group d" 1
是否可以进行查询甚至是 label_replace
将“杂项”组组合在一起?
(我意识到指标基数需要改进,我已经更新了应用程序来修复它。但是它给我留下了这个问题,如果我想稍后通过查询来修复指标)
【问题讨论】:
【参考方案1】:是的,您可以使用标签替换将所有杂项组合在一起:
sum by (new_group) (
label_replace(
label_replace(my_metric, "new_group", "$1", "group", ".+"),
"new_group", "misc", "group", "misc group.+"
)
)
内部 label_replace 将 group 中的所有值复制到 new_group 中,外部将匹配“misc group.+”的值覆盖为“misc”,然后我们通过“new_group”标签求和。使用新标签的原因是,如果我们只是覆盖“组”标签,则该系列将不再是唯一的,并且总和将不起作用。
【讨论】:
难道只能通过以下方式获得相同的结果:sum by (misc) ( label_replace(my_metrics, "misc", "group", "misc group.+") )
要根据正则表达式对标签进行分组,请参阅这篇文章中接受的答案:***.com/questions/66669688/…【参考方案2】:
更简单
sum by (group) (my_metric)
【讨论】:
这是否解决了原始问题的第二部分,即对“杂项”标签进行分组? 如果您需要,也可以将它们组合起来像sum(my_metricgroup=~"group.*") by (group)
对于这个查询,如果我写一个像sum by (group) (my_metric) > 0
这样的警报,我如何访问group
这个名字? group
之类的东西?【参考方案3】:
您可以使用正则表达式查询:
my_metricgroup=~"misc group.+"
这将为您提供group
以“misc group”开头的所有内容。
【讨论】:
以上是关于如何在 Prometheus 查询中对标签进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
在 graylog、prometheus、grafana 等工具中对历史警报进行分组
如何使用 promql 在新标签上对两个 Prometheus 时间序列进行分组?