夜莺监控手把手配置 Prometheus 告警
本文是手把手教程,所以会比较冗长,请自行跳过已经熟悉的部分。本文的大纲如下:
- 夜莺监控项目简介
- 快速搭建夜莺监控
- 接入 Prometheus 数据源
- 配置告警规则
- 配置通知规则
- 收到告警通知以及如何自定义消息模板
夜莺监控项目简介
夜莺监控是一个开源的监控告警系统,类似 Grafana 可以接入多种数据源,不过 Grafana 侧重点是可视化,夜莺的侧重点是告警。当前(2025.4.9)版本是 v8 的 beta10,支持 Prometheus、VictoriaMetrics、Thanos、M3DB、ElasticSearch、Loki、TDEngine 等数据源。产品逻辑示意图如下:
如果你有多套 Prometheus、VictoriaMetrics,想统一管理告警规则、通知规则,可以尝试夜莺,如果你既有指标时序库,又有 ElasticSearch、Loki 等日志库,想要在一个平台管理告警,可以尝试夜莺。
夜莺的 github 地址是:https://github.com/ccfos/nightingale 当前 star 是 10.8k,社区活跃度还不错,repo group 是 ccfos,表示中国计算机学会开源发展委员会,夜莺最初是由滴滴的团队开发开源的,后来捐赠给基金会了,大概率会长期存续维护,不会像一些 KPI 项目一样,开发者离职、调岗就不维护了。
快速搭建夜莺监控
夜莺的最新发布包可以从 github releases 页面下载:https://github.com/ccfos/nightingale/releases。解压缩,既可以使用 Docker compose 方式运行,也可以使用二进制方式运行。
Docker compose 方式
解压缩之后,进入 docker/compose-bridge
目录,执行 docker-compose up -d
命令,即可启动所有组件。不过我个人更喜欢二进制的方式部署,可以对各个组件有更精细的控制和了解。
二进制方式
普通场景使用,夜莺其实只有一个二进制,就是压缩包里的 n9e
,生产环境运行的话依赖 MySQL 和 Redis,如果只是为了快速尝试,直接使用内置的 SQLite 数据库和内存数据库即可。我这里就使用最简单的方式,直接运行:
./n9e
为了快速演示,我直接把进程运行在前台了,生产环境的话,建议使用 systemd 托管,我也没有修改夜莺的配置文件 etc/config.toml
,默认会使用 SQLite 数据库和内存数据库。
端口和登录方式
不管是 Docker compose 方式还是二进制方式,夜莺的端口都是 17000,使用 root
、root.2020
登录。
接入 Prometheus 数据源
从菜单里找到数据源,点击新增,然后选择 Prometheus Like 数据源,这个数据源可以接入所有和 Prometheus 查询接口兼容的数据源。然后填写时序库的名称、URL 即可,如果有 Basic Auth 认证,记得填写用户名和密码。
关于更多配置项,比如 Remote write url、时序库内网地址,都有一个小问号提示说明,可以自行阅读说明,初步测试还用不到,这里不再赘述。
配置了数据源,夜莺就可以查询数据了,我们找到「即时查询」菜单,进去查询一下数据测试一下:
能查到数据,后面就可以配置告警规则了。
配置告警规则
从菜单里找到告警规则,然后选择「Default Busi Group」业务组,这个业务组是系统安装完成之后自动创建的,你可以自行创建自己的业务组,告警规则未来会很多,需要分门别类管理,也需要统一权限管理,所以告警规则要归属到某个业务组下。选中「Default Busi Group」之后,右侧点击「新增」按钮即可创建告警规则,也可以点击「导入」按钮,导入一批告警告警,「导入」的时候,可以导入系统内置的告警规则,也可以导入 Prometheus 的告警规则,夜莺会自动转换成夜莺的告警规则格式。
这里我们选择「新增」,进入告警规则配置页面,首先给规则随便取个名字,然后选择 Prometheus 数据源类型,然后下面的数据源筛选这里,我直接选择全部数据源:
夜莺的告警规则,可以生效给所有数据源,也可以生效给指定的数据源,很多公司都有很多套 Prometheus,这个功能可以很好的支持多套 Prometheus 的告警规则管理。然后,就是配置 Promql,即告警条件那里:
要玩转 Prometheus 和 Nightingale,Promql 是必备技能,如果你还不熟悉 Promql,可以联系我(我的微信picobyte
)索要 Promql 学习资料。上面我为了快速验证效果,配置了 node_memory_MemAvailable_bytes > 0
,node_memory_MemAvailable_bytes 这个指标的值肯定是大于 0 的,所以这个规则很快就会触发告警。当然了,为了更快触发,我把执行频率设置成了 @every 15s
,把持续时长设置为 0,这俩字段也有小问号 tooltip,可以自行查看其说明。
之后的配置:
- 事件 relabel:是对生成的告警事件做 relabel,比如 drop 掉某些标签,跟 Prometheus 的 relabel 很像,只不过 Prometheus 是针对指标数据做 relabel,夜莺这里是针对告警事件做 relabel。
- 生效配置:可以维持不动,后面再研究,核心就是配置哪些时段生效。
- 通知配置是控制告警事件具体如何发送,待会再讲,我们先看能否生成告警事件。
保存之后稍等片刻,就会看到告警规则前面的状态图标变成红色的感叹号:
点击感叹号,就可以看到这个告警规则触发的告警事件了,也可以进入「活跃告警」「历史告警」菜单,查询当前所有告警。
告警事件产生了,接下来就是如何通知的问题了。下面我们配置一下通知规则。
配置通知规则
告警规则和通知规则的关系图如下:
很多告警规则,都可以关联一个通知规则,这个通知规则里配置发哪些媒介,比如 Critical 的告警打电话、发短信、发钉钉,Info 级别的告警就只发钉钉。
这里我配置一个简单的通知规则,让所有的告警都发钉钉,找到「通知规则」这个菜单,点击新增:
通知规则的配置项有:
- 名称:随便取个名字
- 授权团队:指定一个团队,未来这个团队的人可以管理这个通知规则
- 通知媒介:选择 DingTalk,这个是夜莺内置的通知媒介,表示钉钉
- 消息模板:选择 Dingtalk,这个是夜莺内置的消息模板,表示钉钉的消息模板
- Access Token:填写钉钉机器人的 Webhook 里的 Access Token 参数
- Bot Name:填写钉钉机器人的名称,随便填
钉钉机器人如果创建这里不赘述了,其中要注意的是,钉钉机器人创建的时候需要选择安全设置,我们选择自定义关键字的方式,关键字写 20
,因为告警消息里肯定有告警时间,所以这个关键字是必然会出现的。然后,点击保存,通知规则就创建好了。
之后,我们重新回到告警规则,在告警规则里配置关联的通知规则,这样一来,这个告警规则生成的所有告警事件,都会通过这个通知规则来发送。同时也顺便修改一下 promql,改成 node_memory_MemAvailable_bytes < 0
,这样很快就会触发恢复消息。
收到告警通知以及如何自定义消息模板
因为之前已经告警了,现在把 promql 改成 node_memory_MemAvailable_bytes < 0
,所以告警恢复,触发恢复通知。整个流程就跑通了。
接下来你可以自行看看 Dingtalk 的通知媒介和消息模板,熟悉一下,未来可能会有自定义的需求。通常来讲,大家会有两个额外需求:
- 自定义消息模板:尤其是要让告警消息里那几个链接可用
- 支持 at 人的功能
自定义消息模板
找到菜单「消息模板」,找到「Dingtalk」消息模板,右侧就可以看到消息体了,修改 Content 这个 go template 模板,就可以自定义最终的通知的消息了。
右侧有详细的文档说明,这里不再赘述。其中比较关键的是 $domain
变量,改成你的夜莺的 URL 地址,这样告警消息里的链接就可以点击了。
支持 at 人的功能
具体如何配置可以参考:https://flashcat.cloud/blog/n9e-v8-notify-dingtalk-ats/。这里我也概要说一下:
- 点击右上角登录用户名,个人信息,配置一下手机号,因为 at 人需要根据手机号来 at
- 去通知媒介里,找到 DingTalk 通知媒介,修改一下,联系方式那里选择
Phone
- 重新打开通知规则,会看到 DingTalk 媒介下面多了接收人、接收团队两个配置,这就是要 at 的人,比如想 at
root
用户,就在接收人那里选择root
即可 - 重新修改告警规则,改改 promql,让告警重新触发,比如:
node_memory_MemAvailable_bytes > 0
,然后等着即可
稍等片刻就可以看到 at 人的效果了。
结语
本文详细演示了夜莺接入 Prometheus 告警的配置过程,包含搭建夜莺、接入数据源、配置告警规则、通知规则等。夜莺的告警规则和通知规则都很灵活,支持多种数据源和多种通知媒介,希望对大家有帮助。