PromQL 变量查询

从实际使用场景出发,介绍夜莺告警规则的 PromQL 变量:用机器标识、枚举值、阈值、网络设备四类变量,让一条规则覆盖一批机器并做差异化阈值。

概述

同一条告警规则想覆盖一批机器,但常遇到几个诉求:只想监控筛选出来的某些机器、个别机器要用不同的阈值、只关注某个标签的某几个值——这些都可以用变量解决,避免为每台机器、每套阈值各建一条规则。

变量的用法是:在告警条件里打开「启用变量」开关,在「变量配置」里定义变量,然后在 PromQL 里用 $变量名 占位。告警执行时,引擎把 $变量名 替换成变量的实际取值再查询——机器标识、枚举值这类变量会展开成多次查询(每个取值一次)。

配置入口:告警规则编辑页 → 第 3 步「告警条件」→ 打开「启用变量」→ 点「变量配置」的 ⊕ 新增变量。

变量配置弹窗

每个变量有变量名变量类型两个属性,共四种类型:

变量类型 用途 在 PromQL 里的引用
机器标识 筛选一批机器,$变量名 替换为机器的 ident mem_available_percent{ident="$ident"}
枚举值 只监控某标签的某几个值,逐值展开 http_requests_total{code="$code"}
阈值 一个数值,可配合变量筛选给不同机器设不同阈值 ... > $val
网络设备(PLUS) 筛选一批网络设备,$变量名 替换为设备地址 snmp_icmp_packet_loss{agent_host="$ip"}

下面按实际使用场景介绍。

场景一:只监控筛选出来的一批机器(机器标识变量)

只想对某些机器做监控,而不是数据源里的全部机器。新增一个机器标识类型变量(比如命名 ident),在弹窗里选中目标机器;然后在 PromQL 里用 $ident 占位:

mem_available_percent{ident="$ident"} > 80

执行时 $ident 会展开成筛选到的每台机器,逐台判定。

场景二:给特殊机器配不同阈值(阈值变量 + 变量筛选)

一批机器大部分用同一个阈值,但个别机器比较特殊要用不同阈值。这时用阈值变量:

  1. 新增一个阈值变量(比如命名 val),设默认值 80,PromQL 写成 mem_available_percent{...} > $val
  2. 在查询条件下方点「变量筛选」添加一条子筛选,机器标识选中那几台特殊机器,把它们的 val 设为 90

效果:默认所有机器阈值是 80,被子筛选选中的那几台机器阈值是 90。这样一条规则就同时管住了"大多数机器 80、少数机器 90",不用拆成两条规则。

场景三:只监控某标签的某几个值(枚举值变量)

某个标签有很多取值,但你只关心其中几个。用枚举值变量,填入要监控的几个值,PromQL 里用 $变量名 引用。执行时逐个枚举值展开成独立查询,各自判定。

场景四:筛选网络设备(网络设备变量,PLUS)

[PLUS] 网络设备变量是夜莺企业版(PLUS)独有类型。

针对网络设备监控(如 SNMP 采集的丢包率),用网络设备类型变量筛选一批设备,PromQL 里用 $变量名 替换为设备地址:

snmp_icmp_packet_loss{agent_host="$ip"} > 0

常见问题

Q1:变量能跨告警规则共享吗?

A:不能,变量只在定义它的这条规则内有效。跨规则复用通用筛选条件,建议用基础配置的附加标签,或用标签词表统一注入标签。

Q2:一条规则能定义几个变量?一起用吗?

A:可以定义多个,并在同一段 PromQL 里同时引用。典型组合是「机器标识变量 $ident + 阈值变量 $val」:mem_available_percent{ident="$ident"} > $val,配合变量筛选实现按机器差异化阈值。

Q3:变量筛选(子筛选)是做什么的?

A:给部分对象覆盖变量取值。最常见的用法就是场景二——大多数机器用默认阈值,子筛选里选中的少数机器用另一个阈值。

Q4:这个变量和仪表盘的变量是一回事吗?

A:不是。仪表盘变量用于看图时下拉切换、交互展示;这里的变量用于告警查询执行时的静态替换与展开,一旦配置就按规则跑,没有交互。

参考资料

更新时间 2026-07-17

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云