跳转到主要内容
Monitors 兼容 Prometheus 的 PromQL 查询语法,并提供了灵活的告警判定与恢复机制。

核心概念

告警引擎支持三种核心判定模式:

阈值判定

查询返回原始指标数值,由告警引擎在内存中进行阈值比对

数据存在

查询语句包含过滤条件,仅返回异常数据,查到数据即告警

数据缺失

用于监控数据上报中断的场景

1. 阈值判定模式

此模式适用于需要对同一指标进行多级告警(如 Info/Warning/Critical)或需要获取精确恢复值的场景。

配置方式

  • 查询语句 (PromQL):编写 不包含 比较运算符的 PromQL,只返回指标数值。
    • 示例:查询内存使用率
      (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
      
  • 阈值条件:在规则配置中定义不同严重级别的阈值表达式。变量 $A 代表查询结果的值。
    • Critical$A > 90(内存使用率超过 90% 触发严重告警)
    • Warning$A > 80(内存使用率超过 80% 触发警告告警)

多查询支持与数据关联

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 (...) 等聚合操作,显式控制返回的标签,确保多条查询结果的标签一致。

工作原理

告警引擎周期性执行 PromQL,获取所有 Series 的当前值。随后,引擎遍历每个 Series,依次匹配 Critical、Warning、Info 条件。一旦满足某个级别的条件,即产生对应级别的告警事件。

恢复逻辑

支持多种恢复策略:
策略说明
自动恢复当最新查询结果不再满足任何告警阈值时,自动生成恢复事件
特定恢复条件可配置额外的恢复表达式(如 $A < 75),避免在阈值附近频繁震荡
恢复查询自定义一条 PromQL 用于恢复判定,查到数据即恢复
恢复查询语句支持嵌入变量(格式为 ${label_name}),会被自动替换为告警事件中对应的标签值,实现针对具体告警对象的精确检测。

2. 数据存在模式 (Data Exists)

此模式与 Prometheus 原生告警规则(Alerting Rules)的行为一致。适用于习惯直接在 PromQL 中定义阈值的用户,或需要高性能处理大量 Series 的场景。

配置方式

  • 查询语句:编写 包含 比较运算符的 PromQL,仅筛选出异常数据。
    • 示例:查询内存使用率超过 90% 的节点
      (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 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",则在恢复查询中可以这样写:
up{instance="${instance}", job="${job}"} == 1
告警引擎执行时,会将 ${instance} 替换为 host-1${job} 替换为 node,也就是告警事件标签中的具体值。

关联查询 (Enrichment)

为了丰富告警通知的内容,可以配置”关联查询”。关联查询不参与告警判定,仅用于获取额外信息。
  • 场景:CPU 告警时,同时查询该机器的 mem_usage_percent 负载情况,展示在告警详情中,辅助排查。
  • 变量:关联查询中支持 ${label_name} 变量,用于针对具体告警对象查询。
  • 结果展示:关联查询的结果可以在告警规则的备注描述中引用,其变量是 $relates,您可以查看 备注描述 的详细使用说明。