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

Rob*_*est 26 monitoring consul prometheus

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

我从这个讨论中了解到,服务标签可能会作为单独的指标导出,但我不确定如何将一个系列与另一个系列连接起来,因此我可以利用具有健康状态的标签.

例如,以下查询:

max(consul_health_service_status{status="critical"}) by (service_name, status,node) == 1
Run Code Online (Sandbox Code Playgroud)

可以回来:

{node="app-server-02",service_name="app-server",status="critical"} 1
Run Code Online (Sandbox Code Playgroud)

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

consul_service_tags{node="app-server-02",service_name="app-server",env="prod"} 1
Run Code Online (Sandbox Code Playgroud)

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

{node="app-server-02",service_name="app-server",status="critical",env="prod"} 1
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*830 24

您可以使用参数列表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
)
Run Code Online (Sandbox Code Playgroud)

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

  • +是"滥用"作为联接运算符(细因为0 * consul_service_tags总是具有值1)
  • group_left(env)是包含env右边额外标签的修饰符(consul_service_tags)

  • [很好的 PromQL 入门](https://www.section.io/blog/prometheus-querying/) 如果这对你来说和几个小时前对我来说一样难以理解:joy: (4认同)
  • `consul_service_tags` 始终为 1,因此代替 `* 0` 和 `+`,更简单的方法更像是 `(max(consul_health_service_status{status="ritic"}) by (service_name,status,node) == 1) * on(service_name,node) group_left(env) consul_service_tags` (2认同)

val*_*ala 9

在 Prometheus 生态系统中,公开其他标签是一种很好的做法,这些标签可以通过单独的类似指标连接到多个指标,如本文info所述。例如,指标公开了一组标签,可以通过标签将其连接到指标。consul_service_tags(service_name, node)

连接通常通过应用于操作的on()和修饰符来执行。不会修改左侧时间序列的值,因为类似指标通常具有恒定值。该修饰符用于限制用于在 的左侧和右侧查找匹配时间序列的标签。该修饰符用于在 的右侧添加时间序列的附加标签。有关详细信息,请参阅这些文档group_left()**info1on()*group_left()*

例如,以下 PromQL 查询使用相同的标签集将env标签从指标添加consul_service_tags到指标:consul_health_service_status(service_name, node)

consul_health_service_status
  * on(service_name, node) group_left(env)
consul_service_tags
Run Code Online (Sandbox Code Playgroud)

如果需要,可以添加其他标签过滤器consul_health_service_status。例如,以下查询仅返回带status="critical"标签的时间序列:

consul_health_service_status{status="critical"}
  * on(service_name, node) group_left(env)
consul_service_tags
Run Code Online (Sandbox Code Playgroud)