如何在 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 等工具中对历史警报进行分组

Prometheus 查询按特定标签随时间平均

如何使用 promql 在新标签上对两个 Prometheus 时间序列进行分组?

如何在 Bootstrap 中对不同表单标签中的按钮进行分组

请求有关如何在一个查询中对多个条件的计数进行分组的帮助

如何在一列中对数据进行分组?