核心概念
告警引擎支持三种核心判定模式:阈值判定
查询返回原始指标数值,由告警引擎在内存中进行阈值比对
数据存在
查询语句包含过滤条件,仅返回异常数据,查到数据即告警
数据缺失
用于监控数据上报中断的场景
1. 阈值判定模式
此模式适用于需要对同一指标进行多级告警(如 Info/Warning/Critical)或需要获取精确恢复值的场景。配置方式
- 查询语句 (PromQL):编写 不包含 比较运算符的 PromQL,只返回指标数值。
- 示例:查询内存使用率
- 示例:查询内存使用率
- 阈值条件:在规则配置中定义不同严重级别的阈值表达式。变量
$A代表查询结果的值。- Critical:
$A > 90(内存使用率超过 90% 触发严重告警) - Warning:
$A > 80(内存使用率超过 80% 触发警告告警)
- Critical:
多查询支持与数据关联
Monitors 支持在一个告警规则中配置多条查询语句(分别命名为 A、B、C…),并支持在阈值表达式中同时引用这些查询结果(如$A > 90 and $B < 50)。
- 自动关联:告警引擎会自动根据 标签 对不同查询语句返回的结果进行关联。
- 对齐要求:只有当两条查询语句返回的数据包含 完全相同 的标签集时,它们才能被关联到同一组上下文中进行计算。
- 示例:查询 A 返回
cpu_usage_percent{instance="host-1", job="node"},查询 B 返回mem_usage_percent{instance="host-1", job="node"},则$A和$B可以成功关联。 - 注意:如果查询 A 多了一个标签(如
disk="/"),而查询 B 没有,则无法关联。建议在 PromQL 中使用sum by (...)或avg by (...)等聚合操作,显式控制返回的标签,确保多条查询结果的标签一致。
- 示例:查询 A 返回
工作原理
告警引擎周期性执行 PromQL,获取所有 Series 的当前值。随后,引擎遍历每个 Series,依次匹配 Critical、Warning、Info 条件。一旦满足某个级别的条件,即产生对应级别的告警事件。恢复逻辑
支持多种恢复策略:| 策略 | 说明 |
|---|---|
| 自动恢复 | 当最新查询结果不再满足任何告警阈值时,自动生成恢复事件 |
| 特定恢复条件 | 可配置额外的恢复表达式(如 $A < 75),避免在阈值附近频繁震荡 |
| 恢复查询 | 自定义一条 PromQL 用于恢复判定,查到数据即恢复 |
恢复查询语句支持嵌入变量(格式为
${label_name}),会被自动替换为告警事件中对应的标签值,实现针对具体告警对象的精确检测。2. 数据存在模式 (Data Exists)
此模式与 Prometheus 原生告警规则(Alerting Rules)的行为一致。适用于习惯直接在 PromQL 中定义阈值的用户,或需要高性能处理大量 Series 的场景。配置方式
- 查询语句:编写 包含 比较运算符的 PromQL,仅筛选出异常数据。
- 示例:查询内存使用率超过 90% 的节点
- 示例:查询内存使用率超过 90% 的节点
- 判定规则:无需额外配置阈值表达式。引擎只要查询到结果,即认为触发告警,查到几条数据就生成几个告警事件。
恢复逻辑
- 数据消失即恢复:引擎周期性查询,如果某些数据查不到了,引擎判定对应的告警恢复。注意:数据的标识是基于标签集的。
- 恢复查询(可选):可配置一个独立的查询语句用于判定恢复(例如查询
up{instance="${instance}"} == 1来确认服务恢复),查到数据才算恢复。这个 QL 中引入了变量${instance},会被替换为告警事件中的具体标签值。
优缺点分析
- 优点
- 缺点
- 性能更优:过滤逻辑下推至 Prometheus 服务端,减少了传输到告警引擎的数据量
- 迁移成本低:可直接复用现有的 Prometheus Rule 语句
3. 数据缺失模式 (No Data)
此模式专门用于监控监控对象是否存活或数据上报链路是否正常。配置方式
- 查询语句:编写预期应该一直存在的指标查询。
- 示例:
up{job="my-service"}
- 示例:
- 判定规则:如果连续 N 个周期无法查询到该 Series 的数据(注意:是完全查不到数据,而不是值为 0),则触发”数据缺失”告警。
- 引擎重启:如果告警引擎(monitedge)重启,内存中的状态丢失,如果重启之前可以查到的数据重启之后恰好查不到了,则无法告警。重启之后会重新开始统计缺失周期。
典型应用
- 监控 Exporter 宕机。
- 监控埋点上报服务中断。
- 监控批处理任务未按时执行。
对比 Prometheus 原生的 absent() 函数
| 方式 | 说明 |
|---|---|
Prometheus absent() | 需要把每个标识类的标签组合都列举出来,多个实例需多条语句 |
| Monitors 数据缺失模式 | 只需一条查询语句,自动对所有 Series 进行监控 |
高级配置
标签与变量
Monitors 会自动解析 Prometheus 返回的 Labels。在 恢复查询 或 关联查询 中,可以使用${label_name} 引用标签值。
比如某个告警规则查询语句返回的结果包含标签 instance="host-1" 和 job="node",则在恢复查询中可以这样写:
${instance} 替换为 host-1,${job} 替换为 node,也就是告警事件标签中的具体值。
关联查询 (Enrichment)
为了丰富告警通知的内容,可以配置”关联查询”。关联查询不参与告警判定,仅用于获取额外信息。- 场景:CPU 告警时,同时查询该机器的
mem_usage_percent负载情况,展示在告警详情中,辅助排查。 - 变量:关联查询中支持
${label_name}变量,用于针对具体告警对象查询。 - 结果展示:关联查询的结果可以在告警规则的备注描述中引用,其变量是
$relates,您可以查看 备注描述 的详细使用说明。