Prometheus:如何在查询中获取 label_value()
Prometheus: how to get label_value() in query
所以我有 2 个指标,我需要从第一个指标获取标签值,然后查询第二个指标,其中 {param="label_values_from_1st_metric"}。
例如:
metric_1{instance="abc"}
- returns 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 面板中的变量,因此我无法编写一个可以为我执行此操作的查询。
您可以通过以下方式尝试:
metric_2 * on(instance) group_left(host) metric_1{instance="abc"}
on(instance) => 这是加入标签实例的方法。
group_left(host) metric_1{instance="abc"} => 表示,将标签主机从 metric_1 在结果中。
好的,我终于明白了。所以正如 Pulak Kanti 所建议的,我使用了 group_left。但是它返回错误:不允许多对多数学运算。
所以我做了什么:
metric_1和metric_2之间的标签不匹配,但是是修复它很简单,我们需要添加 label_replace() func
label_replace(metric_2,"host","","domain", "(.+)")
。此表达式添加到 metric_2 标签 host,并使用从标签 domain 复制的值。从我们的角度来看,我们刚刚将标签 domain 重命名为标签 host。这是个好消息,因为现在 metric_1 和 metric_2 有一个共同的标签 - host。
所以这一步的查询看起来像这样:
label_replace(metric_2,"host","","domain", "(.+)") + on (host) group_left(domain) metric_1{instance="abc"}
现在我们的查询至少没有返回任何错误,但是,它 returns 出乎意料的结果——这是因为它将 metric_2 的值与 metric_1。因为我们只需要来自 metric_2 的值,我们可以将 metric_1 设为 null,所以它最终是:
label_replace(metric_2,"host","","domain", "(.+)") + on (host) group_left(domain) 0*metric_1{instance="abc"}
我知道此查询无效,但它对我有用。如果有人能提供帮助并使此查询更有效率,我将不胜感激。
顺便说一句:这里 group_left() 括号内的内容并不重要,因为它只影响我们显示的标签,对我来说这并不重要,所以
label_replace(metric_2,"host","","domain", "(.+)") + on (host) group_left() 0*metric_1{instance="abc"}
也有效。
以下查询如果由优化的 Prometheus-compatible 查询引擎执行,例如 VictoriaMetrics:
metric_2 and on(domain) label_copy(metric_1{instance="abc"}, "host", "domain")
VictoriaMetrics 从 a and b
查询的右侧部分开始,例如它执行 label_copy(metric_1{instance="abc"}, "host", "domain")
。然后它为返回的时间序列找到唯一的 domain
标签值,并将 domain
标签上的附加标签过滤器传递到 a and b
查询的左侧部分。然后它执行查询的左侧部分 - metric_2{domain=~"domain1|...|domainN"}
- 和 returns 匹配的时间序列。
如果不进行此优化,所有名称为 metric_2
的时间序列都会在根据 these matching rules.
执行 a and b
查询期间被删除之前被选中
所以我有 2 个指标,我需要从第一个指标获取标签值,然后查询第二个指标,其中 {param="label_values_from_1st_metric"}。 例如:
metric_1{instance="abc"}
- returns 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 面板中的变量,因此我无法编写一个可以为我执行此操作的查询。
您可以通过以下方式尝试:
metric_2 * on(instance) group_left(host) metric_1{instance="abc"}
on(instance) => 这是加入标签实例的方法。
group_left(host) metric_1{instance="abc"} => 表示,将标签主机从 metric_1 在结果中。
好的,我终于明白了。所以正如 Pulak Kanti 所建议的,我使用了 group_left。但是它返回错误:不允许多对多数学运算。 所以我做了什么:
metric_1和metric_2之间的标签不匹配,但是是修复它很简单,我们需要添加 label_replace() func
label_replace(metric_2,"host","","domain", "(.+)")
。此表达式添加到 metric_2 标签 host,并使用从标签 domain 复制的值。从我们的角度来看,我们刚刚将标签 domain 重命名为标签 host。这是个好消息,因为现在 metric_1 和 metric_2 有一个共同的标签 - host。 所以这一步的查询看起来像这样:label_replace(metric_2,"host","","domain", "(.+)") + on (host) group_left(domain) metric_1{instance="abc"}
现在我们的查询至少没有返回任何错误,但是,它 returns 出乎意料的结果——这是因为它将 metric_2 的值与 metric_1。因为我们只需要来自 metric_2 的值,我们可以将 metric_1 设为 null,所以它最终是:
label_replace(metric_2,"host","","domain", "(.+)") + on (host) group_left(domain) 0*metric_1{instance="abc"}
我知道此查询无效,但它对我有用。如果有人能提供帮助并使此查询更有效率,我将不胜感激。
顺便说一句:这里 group_left() 括号内的内容并不重要,因为它只影响我们显示的标签,对我来说这并不重要,所以
label_replace(metric_2,"host","","domain", "(.+)") + on (host) group_left() 0*metric_1{instance="abc"}
也有效。
以下查询如果由优化的 Prometheus-compatible 查询引擎执行,例如 VictoriaMetrics:
metric_2 and on(domain) label_copy(metric_1{instance="abc"}, "host", "domain")
VictoriaMetrics 从 a and b
查询的右侧部分开始,例如它执行 label_copy(metric_1{instance="abc"}, "host", "domain")
。然后它为返回的时间序列找到唯一的 domain
标签值,并将 domain
标签上的附加标签过滤器传递到 a and b
查询的左侧部分。然后它执行查询的左侧部分 - metric_2{domain=~"domain1|...|domainN"}
- 和 returns 匹配的时间序列。
如果不进行此优化,所有名称为 metric_2
的时间序列都会在根据 these matching rules.
a and b
查询期间被删除之前被选中