【问题标题】:Prometheus:按指标名称对指标进行分组
【发布时间】:2018-08-14 14:25:12
【问题描述】:

有没有办法按指标名称对应用的所有指标进行分组?查询中列出应用所有指标的一部分(即{app="bar"}):

ch_qos_logback_core_Appender_all_total{affiliation="foo",app="bar", instance="baz-3-dasp",job="kubernetes-service-endpoints",kubernetes_name="bar",kubernetes_namespace="foobarz",kubernetes_node="mypaas-dev-node3.fud.com",updatedBy="janedoe"}   44
ch_qos_logback_core_Appender_debug_total{affiliation="foo",app="bar", instance="baz-3-dasp",job="kubernetes-service-endpoints",kubernetes_name="bar",kubernetes_namespace="foobarz",kubernetes_node="mypaas-dev-node23.fud.com",updatedBy="deppba"} 32

我也尝试在指标名称中使用通配符,prometheus 对此有所抱怨。查看指标,我可以看到其中一些具有动态名称,很可能是由 dropwizard 指标提供的。我最终想要的是所有可用指标的列表。

【问题讨论】:

  • 分组是什么意思?你最终想要做什么?
  • 我的意思是我在找到所有可用的指标之后。

标签: prometheus


【解决方案1】:

直接使用

{__name__=~".+"}

将返回success,但不会返回其他内容(太大)。

{__name__=~".*"}

while 会像预期的那样给我们error

parse error at char 17: vector selector must contain at least one non-empty matcher

所以我的诀窍是结合 brian-brazil 和 naimdjon 的解决方案,使用类似

sum({__name__=~"c.*|e.*|n.*|p.*|r.*|k.*|z.*|r.*"}) by (__name__)
  1. 因为我知道可能的prefixes,所以我将它们添加到查询中以确保它至少会返回一些东西;还有,

  2. 为了避免返回无用的字段(强调 Prometheus),我将只需要__name__ 这样by(__name__),我需要的所有指标名称都按预期返回。

实际上有一个API 来获取所有可用的指标名称:

/api/v1/label/__name__/values

【讨论】:

  • 我会将 BOLD 中的最后一部分放在答案的顶部。
  • 我同意这一点。最后一个例子很完美
  • {__name__=~".*"} 只需使用“.+”
【解决方案2】:

我从@brian-brazil 的回答中得到了提示,并找到了解决方案。以下查询列出了所有可用的指标:

sum by(__name__)({app="bar"})

bar 是应用程序名称,您可以在问题中发布的日志条目中看到。

【讨论】:

  • 计数,而不是总和,以查看您使用该名称收集了多少样本
【解决方案3】:

{__name__=~".+"} 将返回所有非陈旧时间序列,但这是一个昂贵的查询,通常应避免。

【讨论】:

  • 是的,但这只是为了弄清楚有哪些指标。试过查询。执行查询时出错:网关超时。
  • 执行查询时出错:无效参数“查询”:1:1:解析错误:指标名称不得设置两次:“metric_name”或“.+”
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2019-02-18
  • 2012-05-23
相关资源
最近更新 更多