利用 Flashduty 实现告警时关联查询

用 Flashduty 告警引擎实现 QPS 突增告警和关联查询,把当前 QPS、昨天同时刻 QPS、最近一个月最大 QPS 写入告警消息,帮助 On-call 快速判断影响。

作者 张望

核心要点

  • 需求是 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 等数据源做告警。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 Flashduty
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云