You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prometheus告警中跨指标复用正则表达式匹配结果?

Prometheus告警中匹配同-NVME实例的表达式语法问题

问题描述

我在编写Prometheus告警时,原本用的表达式是针对单个NVME设备的:

node_hwmon_tempcelsius{sensor="nvme_nvme0"} >= node_hwmon_temp_crit_celsius{sensor="nvme_nvme0"}

现在需要把这个规则应用到nvme0到nvme5所有设备上,但不想手动枚举每个实例。我尝试用正则表达式匹配:

node_hwmon_tempcelsius{sensor=~"^nvme_nvme.*$"} >= node_hwmon_temp_crit_celsius{sensor=~"nvme_nvme.*$"}

但这样会出现指标匹配混乱的问题——我需要第一个正则匹配到的sensor值,必须和第二个正则匹配到的完全一致,也就是同一个NVME设备的温度和临界温度做比较。请问对应的PromQL语法应该怎么写?

我的完整告警定义目前是这样的:

groups:
  - name: 'alert'
    rules:
    - alert: 'NVME Temperature Critical'
      expr: node_hwmon_tempcelsius{sensor=~"^nvme_nvme(.*)$"} >= node_hwmon_temp_crit_celsius{sensor=~"nvme_nvme(.*)$"}
      for: '1m'
      labels:
        severity: 'critical'
      annotations:
        summary: 'Instance {{ $labels.instance }}'
        description: '{{ $labels.instance }} of group {{ $labels.group }} has value {{ $value }}.'

解决方案

要实现同一个NVME设备的温度和临界温度精准匹配比较,需要用到PromQL的标签对齐匹配功能,通过on()子句指定匹配的标签,确保两个指标系列按sensor标签一一对应。

修正后的PromQL表达式

node_hwmon_tempcelsius{sensor=~"^nvme_nvme[0-5]$"} >= on(sensor) node_hwmon_temp_crit_celsius

语法解释

  • on(sensor):指定仅按sensor标签进行匹配对齐,确保两个指标系列的sensor值完全相同时才会进行温度比较,避免跨设备匹配。
  • ^nvme_nvme[0-5]$:精确匹配nvme0到nvme5的设备,避免匹配到其他无关的sensor实例。
  • 右侧的node_hwmon_temp_crit_celsius不需要重复写正则,因为on(sensor)会自动匹配左侧对应的sensor标签值。

完整修正后的告警规则

groups:
  - name: 'alert'
    rules:
    - alert: 'NVME Temperature Critical'
      expr: node_hwmon_tempcelsius{sensor=~"^nvme_nvme[0-5]$"} >= on(sensor) node_hwmon_temp_crit_celsius
      for: '1m'
      labels:
        severity: 'critical'
      annotations:
        summary: 'NVME温度告警: {{ $labels.instance }}'
        description: '实例 {{ $labels.instance }} 的NVME设备 {{ $labels.sensor }} 当前温度 {{ $value }}°C,已超过临界值。'

内容的提问来源于stack exchange,提问作者Goswin von Brederlow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:42:35