如何在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
相关产品推荐
相关产品推荐

