假设我们有以下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规则文件中有办法做到这一点吗?
答案 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")