使用正则表达式通过 Prometheus 矢量匹配来匹配值

问题描述 投票:0回答:1

我有两个带有标签的指标

memory_used

{tenant="1000", instance="testhostb:8888", job="main"}

instance_operating_state

 带标签

{group="B", instance="testhostb:8763", job="main"}
我想根据第二个值过滤第一个。如果他们有相同的实例,我可以使用类似的查询

memory_used and on(instance) (instance_operating_state == 0)
但是它们由不同的出口商暴露,并且有不同的港口。因此,当我尝试使用像上面这样的“on”连接时,我没有得到任何结果,因为完整的实例字符串不匹配。

有没有办法使用正则表达式删除冒号 (:) 之后的所有内容,以便我可以只加入实例名称的第一部分?


实例名称也是固定长度的,因此这可能是我们可以使用的。假设我无法更改数据源配置,并且必须使用 PromQL 和标准 Grafana(无需插件)来执行此操作。

prometheus grafana monitoring observability
1个回答
0
投票
您可以使用

label_replace

 引入基于 instance
 的新标签,并使用该标签进行加入。

label_replace(metric, "hostname", "$1", "instance", "(.+):.+")
将添加标签 

hostname

,其中包含直到 
instance 标签中最后一个1
冒号为止的所有内容。 
演示

因此,假设两种情况下的主机名完全相同,您可以运行以下查询

label_replace(memory_used, "hostname", "$1", "instance", "(.+):.+") and on(hostname) label_replace(instance_operating_state == 0, "hostname", "$1", "instance", "(.+):.+")


1:如果您使用 relabeling 对实例标签进行一些欺骗,这可能需要额外的考虑。例如,如果 instance

 不包含 
:
(因此与 
(.+):.+
 不匹配),则不会添加 
hostname
 标签。

© www.soinside.com 2019 - 2024. All rights reserved.