为 Prometheus 告警规则增加 UI 管理能力

Prometheus 告警规则通常通过 YAML 和 Git 管理,跨团队自助、权限隔离、规则评审和通知治理都会变复杂。本文演示如何用 Nightingale 夜莺监控为 Prometheus alerting rules 增加 UI 管理能力,并介绍数据源接入、规则配置、Prometheus 规则导入和告警引擎能力。

作者 钱程

Prometheus 体系貌似已经成为新时代的监控标准。运维出去找工作,很多公司都要求掌握 Prometheus 相关知识。

但 Prometheus 真正落地之后,经常会遇到一个很具体的问题:告警规则怎么管理。

摘要

  • Prometheus alerting rules 通常写在 YAML 文件里,再通过 Git 做版本管理;这套方式适合工程化审计,但对全公司自助使用不够友好。
  • 当研发团队、业务团队都要配置告警时,规则评审、权限隔离、归属管理、通知策略和误改风险会成为运维团队的负担。
  • Nightingale,即夜莺监控,可以作为 Prometheus 的告警引擎,让用户在 UI 中管理告警规则,并通过业务组和权限控制隔离不同团队的规则。
  • 夜莺不只支持 Prometheus 时序数据,也可以对 VictoriaMetrics、Thanos、Mimir、ElasticSearch、Loki、ClickHouse、MySQL、Postgres 等数据源做告警。
  • 已有 Prometheus YAML 告警规则可以导入夜莺,适合把存量规则迁移到页面化、协作化的管理方式里。

Prometheus 告警规则管理为什么会痛苦

很多公司希望把 Prometheus 能力开放给全公司各个团队自助使用。但 Prometheus 告警规则需要编写 YAML 文件,虽然不少公司已经使用 Git 来管理这些规则,最终仍然需要运维团队统一 Code Review 之后才能 Merge 进主干。

原因很直接:大家担心某个人提交规则时,影响了其他人的规则。

更重一点的流程是,研发团队给运维团队提工单,由运维团队统一维护和管理这些 Prometheus 告警规则。这种方式可以降低误操作风险,但效率也很低。

从规则管理角度看,问题可以拆成几类:

管理问题 在 Prometheus YAML/Git 流程中的表现 夜莺监控的处理方式
自助配置门槛高 研发或业务团队需要理解 YAML、PromQL、Git 提交流程 在 UI 中创建、编辑、导入告警规则
规则互相影响 多个团队共用规则仓库,错误提交可能影响其他规则 通过业务组和权限控制隔离规则归属
运维评审压力大 规则变更都要运维统一 Code Review 或代配置 让团队在权限范围内自助管理规则
通知治理复杂 规则、通知人、通知媒介和升级策略容易混在一起 在告警规则之外配置通知规则,按告警分发
存量迁移成本 已有 Prometheus 规则多为 YAML 支持导入 Prometheus 告警规则

有痛苦必有解法。今天为大家介绍一个开源项目,就是来解决这个问题的,它的名字是 Nightingale,即夜莺监控。

夜莺监控

Nightingale 如何为 Prometheus 增加 UI 管理能力

夜莺监控可以充当 Prometheus 的告警引擎。用户可以在 Nightingale 的 UI 中管理告警规则,UI 有权限控制,不同的规则相互之间没有影响。

它的核心价值不是简单把 YAML 换成表单,而是把 Prometheus 告警规则管理里常见的协作问题一起纳管:谁能创建规则、规则属于哪个业务组、规则查询哪个数据源、触发后通知谁、是否要重复通知、是否要关联自愈脚本。

夜莺告警引擎还有两个基础能力:

  • 夜莺的告警引擎是高可用的,可以部署多个夜莺进程组成集群,某个节点挂了,整体告警功能不受影响。
  • 夜莺不但可以对 Prometheus 时序数据做告警,也可以对 VictoriaMetrics、Thanos、Mimir 等其他时序库告警;也可以对 ElasticSearch、Loki 告警;还可以对 ClickHouse、MySQL、Postgres 等其他存储的数据做告警。

夜莺项目相关地址:

从代码仓库地址可以看出,其 GitHub group 是 ccfos。ccfos 是中国计算机学会开源技术发展委员会的 group,夜莺项目托管在基金会下运作,不会突然闭源或修改开源协议。

下面演示夜莺项目的部署,以及如何用它配置和导入 Prometheus 告警规则。

部署夜莺监控

夜莺监控作为一款开源项目,发布包在 GitHub Releases 页面:

https://github.com/ccfos/nightingale/releases

本文演示使用的是 v8.2.2。我是 arm64 的环境,所以下载 n9e-v8.2.2-linux-arm64.tar.gz

一般生产环境都是 Linux,所以夜莺默认提供的是 Linux 发布包。实际上,夜莺也可以跑在 Windows 或者 Mac 上,只是官方没有提供默认的发布包,需要自行编译。

使用如下命令解压缩:

mkdir n9e
tar zxvf n9e-v8.2.2-linux-arm64.tar.gz -C n9e

然后进入 n9e 目录直接启动:

./n9e

默认监听在 17000 端口,可以使用浏览器访问 WEB UI。默认用户名是 root,默认密码是 root.2020

之所以可以一键启动,是因为默认使用的存储是 sqlite,默认使用的缓存是 miniredis,也就是内置到进程内存里。如果是生产环境,请使用单独的 MySQL 和 Redis。

MySQL 和 Redis 相关连接配置在 n9e 二进制同级目录下的 etc/config.toml 里。配置文件里各项是什么含义,可以参考:夜莺配置文件详解

OK,夜莺部署完了。接下来配置 Prometheus 数据源和告警规则。

接入 Prometheus 数据源

进入夜莺的 集成中心-数据源 管理页面,把 Prometheus 作为数据源配进来。这点跟 Grafana 很像:

夜莺监控-集成中心-数据源

配置完成之后,需要验证数据源是否可用。到 指标-即时查询,查询时序库中的监控数据。如果能够查到数据,说明数据源配置没有问题。

夜莺监控-指标-即时查询

在 UI 中配置 Prometheus 告警规则

菜单位置是 告警-规则管理

由于告警规则可能会有很多,不同团队希望分门别类管理,所以夜莺里抽象了一个业务组的概念。安装完成之后有个默认业务组,选中这个业务组后,右侧会出现新增、导入按钮,用于创建或导入告警规则。

夜莺监控-告警-规则管理

可以先点击新增,大概浏览一下夜莺的告警规则有哪些配置:

夜莺监控-告警-规则配置

基础配置:对应 Prometheus 的 alertname、labels 和 annotations

基础配置用于配置告警规则名称、附加标签和备注。

  • 告警规则名称:对应 Prometheus 里的 alertname
  • 附加标签:对应 Prometheus 里的 labels
  • 备注:对应 Prometheus 里的 annotations.description

因为夜莺里有权限管控,告警规则会归属于某个业务组。刚才我们点击 Default Busi Group 之后再创建规则,所以这个页面会自动填充业务组信息。

夜莺监控-告警-规则配置-基础配置

查询条件:配置 PromQL、执行频率和持续时长

这里配置 PromQL 查询条件,可以配置多个查询条件,多个条件之间支持抑制,也可以启用变量。如果只是简单使用,只需要配置 PromQL 即可。

夜莺监控-告警-规则配置-查询条件

这里有两个字段和 Prometheus alerting rules 的语义很接近:

  • 执行频率:多久查询一次这个 PromQL。如果查到了就表示数据异常,相当于 Prometheus 里的 eval interval。夜莺的执行频率支持 cron 写法。
  • 持续时长:相当于 Prometheus 里的 for 关键字。

各个字段的标题旁边都有一个小问号 icon,鼠标挪上去,有些需要点击,会展示用法提示。

事件 relabel:对告警事件做加工

事件 relabel 是对告警事件做 relabel 操作。Prometheus 生态里也有 relabel 的逻辑,不过常见场景是对 metrics 做 relabel;夜莺这里可以对告警事件做 relabel。

后面还会在告警规则颗粒度引入更多 Processor,支持事件的 Pipeline 处理,那就极为灵活了。

生效时间:控制规则什么时候运行

生效时间配置就是告警规则的生效时间。这个能力对一些证券类场景很有用。

有些时候,告警规则只想白天运行,晚上不想运行;或者白天一个阈值,晚上一个阈值。在夜莺里都可以实现。

夜莺监控-告警-通知规则配置

通知规则、自愈和附加信息

告警事件产生之后要通知出去,所以后面要配置通知规则。通知规则在其他菜单管理,主要用于配置不同的告警发给不同的人,不同的告警使用不同的通知媒介。

比如,高优先级告警可以打电话,低优先级告警可以发邮件。

留观时长、重复通知间隔、最大通知次数,见名知意。右侧也都有小问号 icon,可以点击查看具体用法提示。

另外还有两个常用配置:

  • 告警自愈:夜莺支持在告警的时候去告警机器上执行一个脚本,比如磁盘满了自动清理一下,或者自动抓个现场。所以告警规则这里可以关联自愈脚本。
  • 附加信息:类似 Prometheus 中的 annotations,比如把 SOP 的 URL 放进来。

除了手工创建告警规则,也可以导入 Prometheus 之前的告警规则。

导入已有 Prometheus 告警规则

Prometheus 生态有很多人分享了告警规则,比如 awesome-prometheus-alerts。这个项目的每个目录下都是 YAML 格式的告警规则,比如 host-and-hardware 目录下就是常见的 node-exporter 告警规则。

可以拷贝 YAML 内容,然后在夜莺里点击导入按钮,导入 Prometheus 的规则:

夜莺监控-告警-规则导入

对于已经沉淀了 Prometheus alerting rules 的团队,这个能力比较关键。它不是要求从零开始重建规则,而是把已有 YAML 规则纳入夜莺的 UI 管理、业务组权限和通知治理流程。

夜莺告警引擎的其他能力

除了页面化管理告警规则、支持引擎高可用之外,夜莺的告警规则还有另外两个有意思的点:

  • 可以使用一套告警规则,生效到多个时序库,这样管理起来更方便。
  • 可以处理边缘时序库场景。比如有个时序库能连中心的夜莺进程,但是夜莺进程连不上边缘时序库,这种场景也可以支持。具体可以参考夜莺文档,或者等后面的文章。

FAQ

夜莺是替代 Prometheus 吗?

不是。本文讨论的是 Prometheus 告警规则管理问题。夜莺可以作为告警引擎来管理和执行告警规则,也可以接入 Prometheus 作为数据源。

为什么不用 Git 继续管理 Prometheus 告警规则?

Git 管理规则有版本记录和评审流程,适合工程化管理。但当目标是把 Prometheus 告警能力开放给全公司自助使用时,纯 YAML/Git 流程会把规则编写、权限隔离、通知治理和跨团队协作压力集中到运维团队身上。夜莺的价值在于把这些管理动作放到 UI 和权限体系里。

夜莺能导入已有的 Prometheus YAML 规则吗?

可以。可以把已有 Prometheus 告警规则的 YAML 内容复制出来,在夜莺的规则管理页面点击导入,把存量规则纳入夜莺管理。

夜莺只支持 Prometheus 数据源吗?

不只支持 Prometheus。夜莺还可以对 VictoriaMetrics、Thanos、Mimir 等其他时序库告警,也可以对 ElasticSearch、Loki 告警,还可以对 ClickHouse、MySQL、Postgres 等其他存储的数据做告警。

结论

Prometheus 告警规则真正难的地方,不只是 PromQL 怎么写,而是规则如何在团队之间协作管理:谁能改、改什么、影响谁、触发后通知谁、是否需要自愈、存量规则如何迁移。

夜莺监控提供了一条比较直接的路径:把 Prometheus alerting rules 从 YAML/Git 的单一工程流程,扩展成带 UI、权限、业务组、通知规则和导入能力的告警规则管理体系。

本文介绍了夜莺开源项目如何纳管 Prometheus 告警规则,希望对你有用。

延伸路径

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

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

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