如何比较一系列指标名称中具有相同编号的指标

时间:2019-07-30 14:49:34

标签: prometheus rules promql

假设我们有以下6个指标:

metric1-value      metric1-value-expected
metric2-value      metric2-value-expected
metric3-value      metric3-value-expected

我们想创建一个表达式来根据名称的数量比较这些指标,如下所示:

metric1-value == metric1-value-expected
metric2-value == metric2-value-expected
metric3-value == metric3-value-expected

类似这样的东西:

 {__name__=~"metric.*-value"} == {__name__=~"metric.*-value-expected"}

但是我遇到了以下错误:

  

执行查询时出错:不允许多对多匹配:匹配标签的一侧必须唯一

在Prometheus规则文件中有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

为了进行比较,您需要事先知道指标的名称。我认为要实现这一目标的唯一方法是添加一个标签,用于标识相应的期望值。

做到这一点的典型方法是使用metric_relabel_configs配置。

如果由于某种原因不能这样做,则可以使用label_replace来提取或重命名查询中的指标。

提取ID为

label_replace({__name__=~"metric.*-value"},"id","$1","__name__","(metric.*)-value")

然后您可以指定比较依据的条件

label_replace({__name__=~"metric.*-value"},"id",...) == on(id) label_replace({__name__=~"metric.*-expected"},"id",...)

答案 1 :(得分:0)

实际上问题更大,还有一些指标名称相同但标签不同:

drinks = ["espresso", "chai", "decaf", "drip"]
caffeine = [64, 40, 0, 120]
zipped_drinks = zip(drinks, caffeine)
print(list(zipped_drinks))
zipped_drinks = zip(drinks, caffeine)
drinks_to_caffeine = {key:value for key,value in zipped_drinks}
print(drinks_to_caffeine) 

由于使用度量的第一部分创建了“ id”标签,例如:“ metric1”,由于存在多个度量名称定义,将导致相同的错误。

  

执行查询时出错:不允许多对多匹配:匹配标签的一侧必须唯一

我要做的是创建一个名为“ id”的外部标签,其中包含度量的第一部分和主机名,例如:“ metric1_host2”。为此,我将label_join与label_replace嵌套在一起。

metric1-value{host="host1"}      metric1-value-expected{host="host1"}
metric1-value{host="host2"}      metric1-value-expected{host="host2"}

metric2-value {host="host1"}     metric2-value-expected{host="host1"}
metric2-value {host="host2"}     metric2-value-expected{host="host2"}

metric3-value {host="host1"}     metric3-value-expected{host="host1"}
metric3-value{host="host2"}      metric3-value-expected{host="host2"}

因此,指标将是这样,并且将是唯一的:

label_join(label_replace({__name__=~"metric.*-value"}, "id", "$1", "__name__", "(metric.*)-value"), "id", "_", "id", "host") != label_join(label_replace({__name__=~"metric.*-expected"}, "id", "$1", "__name__", "(metric.*)-expected"), "id", "_", "id", "host")