如何在Prometheus查询中“加入”两个指标?

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

我正在使用consul exporter将我的服务的健康状况和状态摄入普罗米修斯。我想在Consul中的服务和节点状态很关键时发出警报,然后在路由这些警报时使用从Consul中提取的标签。

我从this discussion了解到,服务标签可能会作为单独的指标导出,但我不确定如何将一个系列加入另一个系列,以便我可以利用具有健康状态的标签。

例如,以下查询:

max(consul_health_service_status{status="critical"}) by (service_name, status,node) == 1

可以回来:

{node="app-server-02",service_name="app-server",status="critical"} 1

但是我也喜欢这个系列中的'env':

consul_service_tags{node="app-server-02",service_name="app-server",env="prod"} 1

沿节点和service_name连接以将以下内容作为单个系列传递给Alertmanager:

{node="app-server-02",service_name="app-server",status="critical",env="prod"} 1

然后我可以在我的路由中匹配'env'。

有没有办法做到这一点?它并不像我任何操作或功能那样让我能够像这样分组或加入。据我所知,标签已经需要是consul_health_service_status指标上的标签。

monitoring consul prometheus
1个回答
19
投票

您可以使用group_left的参数列表来包含右操作数中的额外标签(为清晰起见,括号和缩进):

(
  max(consul_health_service_status{status="critical"}) 
  by (service_name,status,node) == 1
)
   + on(service_name,node) group_left(env)
(
   0 * consul_service_tags
)

这里的重要部分是操作+ on(service_name,node) group_left(env)

  • +作为连接运算符被“滥用”(因为0 * consul_service_tags的值总是为0)
  • group_left(env)是包含右边额外标签env的修饰符(consul_service_tags
© www.soinside.com 2019 - 2024. All rights reserved.