前言
从生产稳定性的优先级看,首要监控对象通常是业务北极星指标,其次是应用的 RED 指标,即 Request、Error、Duration。但是,如果目标是快速验证一套监控系统是否可用,从机器监控入手最直接:采集器容易部署,指标容易理解,仪表盘和告警也容易看到效果。
本文以 Prometheus 作为时序库、Categraf 作为采集器、夜莺作为监控告警平台,完整演示一台机器从采集、入库、查询、看图到告警通知的配置流程。
核心要点
- 采集链路:Categraf 采集机器指标,推送给夜莺,夜莺再通过 remote write 转发到 Prometheus。
- 夜莺职责:夜莺负责数据源管理、即时查询、仪表盘、告警规则和通知流程,不直接存储监控时序数据。
- 快速体验:测试环境可以使用 nohup、sqlite 和 miniredis 快速启动;生产环境建议使用 systemd、MySQL 和 Redis。
- 告警验证:可以临时调低告警阈值,确认告警事件与通知链路是否打通。
环境介绍
- OS:Ubuntu 22.04.4 LTS
- CPU Architecture:aarch64
这是我本机的虚拟机,arm64 架构,你也可以使用 x86 架构的 CPU。后文命令里的安装包名称需要按你的 CPU 架构替换。
架构介绍
机器监控数据的采集工具很多,比如 Telegraf、Node-Exporter、Datadog-agent 等。夜莺可以和这些采集器对接,但如果希望少做适配、快速体验夜莺的内置仪表盘和告警规则,Categraf 是更顺手的选择,所以本文使用 Categraf 采集机器监控数据。

每台机器部署 Categraf,采集 CPU、内存、磁盘、IO、进程等监控数据,然后将数据上报到夜莺。夜莺不直接存储监控数据,而是将数据写入时序数据库,比如 Prometheus、VictoriaMetrics 等。上图画的是 Prometheus,下面也以 Prometheus 为例。
| 组件 | 本文中的作用 |
|---|---|
| Categraf | 部署在被监控机器上,负责采集主机指标 |
| 夜莺 | 接收 Categraf 数据,提供查询、仪表盘、告警和通知能力 |
| Prometheus | 作为时序数据库,接收夜莺转发的 remote write 数据 |
安装 Prometheus
从 Prometheus 的官网下载最新版本的 Prometheus,解压之后直接运行即可:
nohup ./prometheus --config.file prometheus.yml --storage.tsdb.path=./data9090 --web.enable-lifecycle --query.lookback-delta=1m --web.listen-address="0.0.0.0:9090" --web.enable-remote-write-receiver &> stdout.log &
如果你已经部署过 Prometheus,可以跳过这一步。上例只是演示用法,直接使用 nohup 启动;生产环境中建议使用 systemd 等工具托管进程。
🔴 注意:夜莺是通过 remote write 协议写数据到 Prometheus,Prometheus 要通过命令行参数开启 remote write 接口,即
--web.enable-remote-write-receiver。这是 Prometheus v2 版本的参数,如果是 Prometheus v3 版本,参数名字不同,可以通过./prometheus --help | grep receiver查看自己参数的具体命名方式。
安装夜莺
从夜莺的 github releases 页面下载最新版本的夜莺,解压之后直接运行即可:
mkdir -p /opt/nightingale
tar zxvf n9e-v8.0.0-beta.6-linux-arm64.tar.gz -C /opt/nightingale
cd /opt/nightingale
nohup ./n9e &> stdout.log &
🔴 注意:我这里采用的版本是 v8.0.0-beta.6,你看到这个文章的时候可能已经有更新的版本了,届时使用最新的版本即可。
这里直接使用 nohup 启动。夜莺默认配置会使用 sqlite 和 miniredis 存储数据,适合测试环境;如果用于生产环境,建议改用 MySQL 和 Redis,并用 systemd 等工具管理进程。
查看 stdout.log 中的日志,可以看到夜莺的默认用户名和密码:root / root.2020,也可以看到夜莺默认监听的端口 17000,通过浏览器访问 http://your-ip:17000 即可看到夜莺的登录页面。
在 集成中心-数据源 页面添加 Prometheus 数据源,填写 Prometheus 的地址即可,如下图所示:

夜莺可以接入多个不同的数据源,比如 Loki、ElasticSearch、Prometheus 等,这里我们只接入 Prometheus,所以只有一个数据源,核心配置就是 Prometheus 的地址:

添加了数据源之后,就可以在即时查询查到监控数据了:

此时可以验证数据源连通性,但还查不到机器监控数据,因为 Categraf 尚未部署。在部署 Categraf 之前,需要先配置夜莺把收到的数据转发到 Prometheus。
配置夜莺转发数据到 Prometheus
Categraf 推送数据给夜莺,夜莺再转发给 Prometheus。夜莺通过 etc/config.toml 中的 [[Pushgw.Writers]] 配置识别写入目标,在 Url 中填写 Prometheus 的 remote write 地址即可:
...
[[Pushgw.Writers]]
Url = "http://127.0.0.1:9090/api/v1/write"
...
如果想把监控数据同时发给多个时序数据库,可以添加多个 [[Pushgw.Writers]] 配置项。比如:
...
# write to prometheus
[[Pushgw.Writers]]
Url = "http://127.0.0.1:9090/api/v1/write"
# write to vminsert
[[Pushgw.Writers]]
Url = "http://127.0.0.1:8480/insert/0/prometheus/api/v1/write"
...
部署 Categraf
到 categraf 的 github releases 页面下载最新版本的 categraf 并解压:
wget https://github.com/flashcatcloud/categraf/releases/download/v0.4.3/categraf-v0.4.3-linux-arm64.tar.gz
tar zxvf categraf-v0.4.3-linux-arm64.tar.gz
编辑 categraf 的配置文件:conf/config.toml,修改其中的 127.0.0.1:17000,改成你的夜莺的地址,然后启动 categraf:
nohup ./categraf &> stdout.log &
检查 stdout.log,确认 Categraf 进程正常启动,并且没有连接夜莺失败的错误。
查看监控数据
等待约 30 秒,就可以在夜莺的即时查询页面看到机器监控数据:

cpu_usage_active 表示 CPU 使用率。
夜莺内置了仪表盘和告警规则,可以去仪表盘列表页面导入机器相关的仪表盘:

点击导入,选择 Linux 组件:

勾选机器常用指标,点击导入即可。

「机器常用指标 - 所有机器」,这个仪表盘点开就可以看到监控数据了,会看到所有机器的监控数据。样例如下:

「机器常用指标 - 只展示业务组内的机器」这个仪表盘点开后可能看不到监控数据,原因是它只展示业务组内的机器,而此时业务组下还没有机器。

修改机器所属的业务组:

把机器加入到「Default Busi Group」这个业务组,然后再刷新「机器常用指标 - 只展示业务组内的机器」就可以看到机器监控数据了。
导入告警规则

告警规则通常需要分组管理,所以规则要归属于某个业务组。进入「告警规则」菜单,选中 Default Busi Group,然后导入机器相关告警规则:

导入之后的效果:

如果机器监控数据触发了规则条件,就会产生告警事件,可以在 告警管理-活跃告警 下查看。为了快速验证链路,也可以临时修改某个告警规则的阈值,让它尽快触发。

这里我修改一下 「CPU利用率较高」这个规则,把 cpu_usage_active 的阈值改成 > 0,这样很快就可以看到告警事件了。

告警通知
这里先配置一个最简单的钉钉通知,验证告警通知是否能送达。钉钉机器人有多种认证方式,示例使用关键字认证,关键字写成 20,因为告警通知中通常会包含时间字段。

然后把回调地址填到告警规则的回调地址中即可:

如果后续需要更复杂的值班、升级、分派和通知模板,可以在告警规则、通知规则和通知媒介中继续扩展。
总结
本文完成了一条最小可用的主机监控链路:Prometheus 负责存储,夜莺负责查询、仪表盘、告警和通知,Categraf 负责采集机器指标。验证时建议按顺序检查四件事:Prometheus remote write 是否开启、夜莺 Pushgw.Writers 是否指向正确地址、Categraf writers 是否指向夜莺、业务组内是否已经关联机器和告警规则。
FAQ
Q1:夜莺是否必须和 Prometheus 一起使用? A:不是。本文为了演示使用 Prometheus,夜莺也可以把数据写入 VictoriaMetrics 等时序数据库。
Q2:为什么仪表盘里没有数据? A:常见原因有三类:Categraf 没有成功上报,夜莺没有成功转发到 Prometheus,或者仪表盘按业务组过滤而机器还没有加入对应业务组。
Q3:测试环境可以直接使用默认 sqlite 和 miniredis 吗? A:可以用于快速体验。生产环境建议使用 MySQL 和 Redis,并用 systemd 等方式托管夜莺、Prometheus 和 Categraf 进程。