核心要点
- 需求是 QPS 突增时触发告警,并在告警消息中展示当前 QPS、昨天同时刻 QPS、最近一个月最大 QPS。
- Prometheus 和 Nightingale 模板中的
query函数可以做关联查询,但模板转义和恢复值处理不够顺手。 - Flashduty 告警引擎可以在规则里配置关联查询,并把查询结果通过 Go template 写入告警备注描述。
- 这类配置适合把“告警触发”升级为“带上下文的告警判断”,让 On-call 人员少切系统、少查数据。
需求背景
我司时序库(Prometheus)里已经有了应用的 QPS 监控数据,想要在 QPS 突增时触发告警,同时希望在告警时能做几个关联查询(把关联查询的数据塞入告警消息中,方便 On-call 人员响应处理):
- 当前 QPS
- 昨天同时刻的 QPS
- 最近一个月最大的 QPS
Prometheus 和 Nightingale 都可以在模板中执行 query 函数来实现关联查询, 但是有两个缺点:
- 不够结构化,需要引号转义之类的,写起来麻烦
- Prometheus 在恢复的时候,拿不到恢复时的值
Flashduty 对这个需求支持的很好,我们最终准备使用 Flashduty 来实现这个需求。
这个需求的关键点不是“多发几个数值”,而是把值班人员判断故障所需的上下文直接放到告警里。对于 QPS 突增类告警,当前值只能说明“此刻异常”,昨天同时刻和最近一个月最大值则能帮助判断这是周期性波动、真实异常,还是接近历史峰值的流量变化。
Flashduty 简介
Flashduty 是一个告警事件的 On-call 平台,支持对接各类监控系统(Prometheus、Nightingale、Zabbix、Grafana、云监控 等等),把告警事件收集到一个中心,做统一的告警降噪、认领、升级、路由、通知等处理。
Flashduty 除了可以做 On-call 这摊事,也可以作为一个告警引擎,查询数据源的数据做告警判定,可以在 Flashduty 中管理告警规则,对自己的数据中心的 Prometheus、VictoriaMetrics、ElasticSearch、ClickHouse 等做告警。
下面我们演示一下具体配置。哦对了,Flashduty 是个 SaaS 服务,可以免费注册试用,也有免费套餐可以用,Flashduty 的告警引擎功能是免费的。注册地址:https://console.flashcat.cloud/
方案设计
本例的处理链路可以概括为四步:
| 步骤 | 配置对象 | 作用 |
|---|---|---|
| 1 | monitedge | 在数据中心侧执行告警引擎相关能力 |
| 2 | 数据源 | 把 Prometheus 接入 Flashduty |
| 3 | 告警规则 | 用 PromQL 判断 QPS 是否比昨天同一时刻增长超过阈值 |
| 4 | 关联查询 | 把当前 QPS、昨天同时刻 QPS、当月最大 QPS 写入告警消息 |
前置条件
要使用 Flashduty 做告警引擎,需要:
1、在自己的数据中心安装告警引擎(monitedge)模块,安装方法见:

2、在 Flashduty 中添加数据源,操作入口:

规则配置
在 Flashduty 中创建一个告警规则,告警规则的创建入口:

在告警规则里,配置数据源为想要生效的 Prometheus 数据源,配置查询语句:
((avg_over_time(app_qps[5m]) - avg_over_time(app_qps[5m] offset 1d)) / avg_over_time(app_qps[5m] offset 1d) * 100) > 50
含义:当前 5 分钟的平均 QPS 比昨天同一时刻的平均 QPS 增加了 50% 以上。
对于这个 promql 查到的结果,不同的数值可以配置为不同的告警级别,我的配置如下:

然后,关键步骤来了,在告警规则里添加三条关联查询,分别写好 当前QPS、昨天同时期QPS、当月最大QPS的查询表达式。最后把关联查询的值展示到备注描述中(语法格式是 go template,看 Flashduty 的字段上那个提示说明即可)

配置关联查询时,建议给每个查询结果起清晰的名称,并在告警备注里按固定顺序展示。这样值班人员收到消息时,可以直接看到“当前值、对比值、历史峰值”三类信息,而不必再打开 Prometheus 手动查。
最终效果
简单测试了一下,最终产生的告警消息中带有了三个关联查询的值:

完美实现需求,丝滑~~
适用场景
关联查询适合以下告警类型:
- 需要和历史同时段对比的指标,比如 QPS、订单量、登录量、接口错误数。
- 需要展示当前值与基线值的告警,比如当前延迟、昨日延迟、近 30 天峰值。
- 值班人员经常在收到告警后还要去 Prometheus、VictoriaMetrics、ElasticSearch 或 ClickHouse 补查上下文的场景。
- 告警恢复时也需要保留关键值,便于复盘判断问题是否真正回落。
FAQ
Q1:为什么不直接在 Prometheus 或 Nightingale 模板里写 query?
A:原文提到两个原因:模板里写关联查询不够结构化,需要处理引号转义;Prometheus 在恢复的时候拿不到恢复时的值。Flashduty 的关联查询配置更适合把多个查询结果结构化展示到告警消息里。
Q2:本文的 PromQL 判断逻辑是什么?
A:示例 PromQL 对比当前 5 分钟平均 QPS 与昨天同一时刻的 5 分钟平均 QPS,如果增长超过 50%,就触发规则。
Q3:关联查询只能用于 Prometheus 吗?
A:本文示例使用 Prometheus 数据源。原文也提到 Flashduty 告警引擎可以管理规则,并对 Prometheus、VictoriaMetrics、ElasticSearch、ClickHouse 等数据源做告警。