【问题标题】:Prometheus: how to get label_value() in queryPrometheus:如何在查询中获取 label_value()
【发布时间】:2021-06-19 02:47:54
【问题描述】:

所以我有 2 个指标,我需要从第一个指标获取标签值,然后查询第二个指标,其中 {param="label_values_from_1st_metric"}。 例如:

metric_1{instance="abc"} - 返回 3 个时间序列:

metric_1{name="my-service", env="production", host="example-0.org"}

metric_1{name="my-service", env="production", host="example-1.org"}

metric_1{name="my-service", env="production", host="example-2.org"}

接下来我需要使用来自第一个查询的 host 值对第二个指标进行查询。

metric_2{domain="exmple-0,1,2.org"}

所以问题是,我如何将 label_values 传递给第二个查询?据我了解,我只能将 label_values() 用于 grafana 面板中的变量,因此我无法编写一个可以为我执行此操作的查询。

【问题讨论】:

    标签: prometheus grafana metrics promql


    【解决方案1】:

    您可以通过以下方式尝试:

    metric_2 * on(instance) group_left(host) metric_1{instance="abc"}
    
    • on(instance) => 这是在标签实例上加入的方法。

    • group_left(host) metric_1{instance="abc"} => 表示,在结果中保留来自metric_1 的标签主机。

    【讨论】:

    • 谢谢。你知道吗,我该如何解决“找到匹配组的重复系列”、“不允许多对多匹配:匹配标签在一侧必须是唯一的”。如果我理解正确,问题是 metric_1{instance="abc"} 返回 3 个时间序列,而不是一个?
    • 是的,我想。它不适用于多对多场景。
    • 天啊,为什么这么复杂。有什么解决方法吗?也许有什么技巧可以让我使用标签对 metric_2 进行查询,从另一个查询中检索到?
    【解决方案2】:

    好吧,我终于明白了。因此,正如 Pulak Kanti 建议的那样,我使用了 group_left。但是它返回错误:不允许多对多数学运算。 所以我做了什么:

    1. metric_1 和 metric_2 之间的标签不匹配,但是修复它很简单,我们需要添加 label_replace() 函数 label_replace(metric_2,"host","$1","domain", "(.+)")。此表达式将使用从标签 domain 复制的值添加到 metric_2 标签 host。从我们的角度来看,我们刚刚将标签 domain 重命名为标签 host。这是个好消息,因为现在 metric_1 和 metric_2 有一个共同的标签 - host。 所以这一步的查询看起来像这样:

      label_replace(metric_2,"host","$1","domain", "(.+)") + on (host) group_left(domain) metric_1{instance="abc"}

    2. 现在我们的查询至少没有返回任何错误,但是,它返回了意外的结果——这是因为它将来自 metric_2 的值与来自 metric_1 的值相乘。因为我们只需要来自 metric_2 的值,所以我们可以将 metric_1 设为空,所以它最终是: label_replace(metric_2,"host","$1","domain", "(.+)") + on (host) group_left(domain) 0*metric_1{instance="abc"}

    我确实了解此查询无效,但它对我有用。如果有人能提供帮助并使这个查询更有效率,我将不胜感激。 顺便说一句:这里 group_left() 括号内的内容并不重要,因为它只影响我们显示的标签,对我来说并不重要,所以 label_replace(metric_2,"host","$1","domain", "(.+)") + on (host) group_left() 0*metric_1{instance="abc"} 也可以。

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2019-12-11
      • 2019-03-06
      相关资源
      最近更新 更多