2

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

4

2 回答 2

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",...)
于 2019-07-30T22:00:32.630 回答
0

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

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"}

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

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

我所做的是创建一个名为“id”的外部标签,其中包含指标的第一部分和主机名,例如:“metric1_host2”。为此,我使用 label_replace 嵌套了 label_join。

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")

因此,指标将是这样的,并且是独一无二的:

metric1-value{host="host2" id="metric1_host2"}
于 2019-07-31T12:57:50.727 回答