这里写目录标题
- 第一章
-
-
-
- 1、夜莺是什么
- [2、和 Prometheus 的关系是?](#2、和 Prometheus 的关系是?)
- [3、夜莺只是告警?那为啥还有个 Categraf 项目?](#3、夜莺只是告警?那为啥还有个 Categraf 项目?)
- [4、夜莺能监控 x 吗?](#4、夜莺能监控 x 吗?)
- 5、夜莺也有仪表盘功能,推荐生产使用吗?
- [6、夜莺和 Flashcat 有什么关系?](#6、夜莺和 Flashcat 有什么关系?)
- [7、夜莺和 Flashduty 有什么关系?](#7、夜莺和 Flashduty 有什么关系?)
-
-
- [第二章 安装部署](#第二章 安装部署)
- 安装前置说明
- 一、夜莺监控部署步骤(二进制源码部署)
-
- [1 下载源码包](#1 下载源码包)
- [2 安装源码包](#2 安装源码包)
- [3. 单节点正式安装](#3. 单节点正式安装)
-
- [3-1 mysql 脚本初始化](#3-1 mysql 脚本初始化)
- [3-2. 启动进程](#3-2. 启动进程)
- [3-2 使用 systemd 管理(推荐)](#3-2 使用 systemd 管理(推荐))
- [第三章 数据源](#第三章 数据源)
-
- 数据源
- 常见问题
- 更改时序数据库配置,导入Prometheus数据源
-
-
- 配置仪表盘
- [创建告警规则 (不推荐新增,推荐导入内置的)](#创建告警规则 (不推荐新增,推荐导入内置的))
-
- 夜莺系统开启API认证
- 发送告警消息
-
-
- [1. 使用短信](#1. 使用短信)
- [2. 使用钉钉](#2. 使用钉钉)
- [3. 使用HTTP API 统一接收夜莺告警事件](#3. 使用HTTP API 统一接收夜莺告警事件)
-
- 告警自愈
- 第二章、部署采集器Categraf
-
- [1 下载安装包](#1 下载安装包)
- [2 安装采集器](#2 安装采集器)
- [3 修改配置文件](#3 修改配置文件)
- [4 查看采集器](#4 查看采集器)
第一章
1、夜莺是什么
夜莺监控,英文名字 Nightingale,是一款侧重告警的监控类开源项目。
夜莺的开源仓库地址:
- 后端:https://github.com/ccfos/nightingale
- 前端:https://github.com/n9e/fe
- 文档:https://n9e.github.io/ 或 https://flashcat.cloud/docs/
类似 Grafana 的数据源集成方式,夜莺也是对接多种既有的数据源,不过 Grafana 侧重在可视化,夜莺是侧重在告警引擎。比如把 Prometheus、VictoriaMetrics、ElasticSearch 等作为数据源接入夜莺,即可在夜莺里配置告警规则做指标、日志的告警。当然了,夜莺也不止做告警,还提供了 ad-hoc 查询、指标视图、仪表盘等可视化能力,不过在可视化方面没有 Grafana 道行深。
夜莺监控最初于 2020 年 3 月 20 日由滴滴开源,后来捐赠予中国计算机学会开源发展委员会(CCF ODC),依托基金会运作。夜莺项目至今已经发布了 100 多个版本,有 CCF 的支持,有快猫星云等公司的持续投入,相信夜莺项目会越来越好。
2、和 Prometheus 的关系是?
既有替代关系也有协同关系。
Prometheus 内置告警引擎,即周期性执行 Alerting rules 然后发给 Alertmanager 处理、分发。夜莺可以替代 Prometheus 内置的告警引擎。夜莺的告警引擎是高可用的,可以水平扩展,即便告警规则比较多,夜莺也可以水平扩展扛住压力。
夜莺可以对接多种数据源,Prometheus 是其中一种,也可以对接 VictoriaMetrics、Thanos、ClickHouse、MySQL、ElasticSearch、Loki 等等。用户既可以配置指标告警规则,也可以配置日志告警规则。
3、夜莺只是告警?那为啥还有个 Categraf 项目?
夜莺侧重点是告警。但是很多用户确实想要一个一站式监控系统,所以夜莺团队开发了 Categraf 监控采集器,作为夜莺的官方采集器。Categraf 负责采集机器的监控指标和元信息,并上报给夜莺。
但是,Categraf 并非必须使用,用户也可以使用其他采集器,比如 Telegraf、Prometheus 生态的各类 Exporter 等等。如果使用 Categraf,在机器监控、元信息上报和自愈脚本执行等方面会有更好的体验。
如果不用 Categraf 做采集器,夜莺核心的告警引擎依然可以正常工作,Ad-hoc 查询和仪表盘也可以工作,但是机器列表为空、机器元信息不可见、自愈脚本不可用。
流程图如下:

稍微展开说一下夜莺的架构:
- 默认情况下,夜莺只有一个进程,即 n9e,这个进程有三个职能:Pushgateway 负责转发收到的时序数据(Categraf 发过来的)给 TSDB; WebUI 负责提供 Web 界面和 API; AlertingEngine 负责执行告警规则并生成告警事件。
- 夜莺不存储时序数据,时序数据存储在外部 TSDB 里,比如 Prometheus、VictoriaMetrics、Thanos 等等。夜莺通过 Prometheus remote write 协议把监控指标转给 TSDB。
- 夜莺仪表盘、告警规则、告警事件等存储在 MySQL 里,机器心跳信息、元信息、JWT Token 存储在 Redis 里。
- 夜莺产生告警事件之后可以做二次处理,比如静默屏蔽、过滤丢弃、富化 Enrichment、和 CMDB、AI 等打通整合,然后通过邮件、短信、飞书、钉钉、Flashduty 等渠道发送通知。
夜莺依赖 mysql 存储各类用户配置,比如告警规则、屏蔽规则、仪表盘,依赖 redis 存储一些机器心跳上来的元信息以及 jwt token,除此之外,没有别的依赖。
对比Prometheus官方是这样说的:
如果您用了多个时序库,比如 Prometheus、VictoriaMetrics、Thanos 等等,需要一个统一的平台来管理告警、看图,夜莺是一个选择。如果您想把监控的能力开放
给公司所有研发团队,让研发团队自助服务,觉得 Prometheus 使用配置文件的告警规则管理方式不方便,夜莺是一个选择。如果您需要更为灵活的告警策略配置,
比如控制生效时间、一套规则生效多个集群,夜莺是一个选择。如果您需要告警自愈能力,告警之后自动执行个脚本啥的,夜莺是一个选择。
4、夜莺能监控 x 吗?
夜莺能监控 Tomcat 吗?夜莺能监控 Nginx 吗?其实夜莺啥都不能监控又啥都能监控。不能监控是因为夜莺本身不采集数据;能监控是因为夜莺可以对接多种数据源。
对于 Categraf 的用户,可以到 Categraf 的插件目录下面看看是否有对应的采集插件,如果没有就说明 Categraf 采集不了。此时也可以考虑使用 Telegraf 或 Prometheus Exporter 来采集数据。只要数据进入 TSDB,就可以用 Grafana 做可视化,用夜莺做告警。
5、夜莺也有仪表盘功能,推荐生产使用吗?
如果有自行制作仪表盘的能力,可以使用,如果没有,建议使用 Grafana,因为 Grafana 生态更大,有很多别人做好的仪表盘。或者混用,比如机器相关的基础的仪表盘,用夜莺自带的,其他业务相关的仪表盘用 Grafana。
6、夜莺和 Flashcat 有什么关系?
Flashcat 是夜莺的商业化产品,是夜莺核心开发团队创业(公司名称:北京快猫星云科技有限公司)做的产品。夜莺定位是告警引擎,Flashcat 定位是一站式可观测性平台,囊括指标、日志、链路追踪、故障分析等更多功能,可以把夜莺看作是 Flashcat 的一个功能模块。
7、夜莺和 Flashduty 有什么关系?
Flashduty 是夜莺团队开发的另一个产品,对标国外的 PagerDuty,是一款 On-call 产品。Flashduty 可以对接各类监控系统,比如夜莺、Alertmanager、Zabbix、云监控、蓝鲸、ElastAlert 等等。Flashduty 专注在告警事件的管理和通知上,提供值班排班、通知策略、事件聚合、告警升级等功能。
第二章 安装部署
安装前置说明
参考文档:https://n9e.github.io/zh/docs/install/upgrade/
常用的安装方式有:
- 二进制方式部署
- Docker compose 方式部署
- Helm 方式部署
首推二进制方式,原因: - 夜莺只有一个二进制文件,没有太多依赖,管理起来比较简单,通常大家对 systemd 都比较熟悉,直接用 systemd 管理夜莺的进程就行了
- Docker compose 方式比二进制方式性能上稍差,而且 Docker compose 方式需要额外 Docker 相关的知识,还有国内网络导致的镜像拉取问题,有时也会比较难受
- Helm 方式用于部署在 Kubernetes 中,但是监控系统是个 P0 级的系统,所有系统都挂了,监控也不能挂,所以如果部署在 Kubernetes 中,那当 Kubernetes 挂的时候,监控也会挂,此时,别的团队可能会来怼你,怨你怎么不提前规划好
不管是哪种安装方式,安装完成后,夜莺的默认用户名是 root,密码是 root.2020。夜莺默认监听的端口是 17000,边缘模式下用的 n9e-edge 端口是 19000。
一、夜莺监控部署步骤(二进制源码部署)
1 下载源码包
这里列出两种官方下载渠道
github: https://github.com/ccfos/nightingale
本文中使用 n9e-v8.5.0-linux-amd64.tar.gz
- 该包适用于 X86 架构;
- 若需 ARM 架构,请下载 arm64 版本;
- 暂无 Windows 官方发布包(因 Nightingale 是服务端项目,通常运行于 Linux);
- 如需在 Windows 或 macOS 上运行,可自行编译(参考项目仓库中的 Makefile)。
2 安装源码包
将下载好的源码包上传到 /usr/local/soft/watch_dog/nightingale
解压
tar zxvf n9e-${version}-linux-amd64.tar.gz -C /usr/local/soft/watch_dog/nightingale
生成完整项目代码(可直接运行)
3. 单节点正式安装
生产环境建议使用 MySQL + Redis 存储数据。
修改配置
编辑 /opt/n9e/etc/config.toml:
数据库配置(DB)
[DB]
DBType = "mysql"
DSN = "YourUsername:YourPassword@tcp(127.0.0.1:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local"
Redis 配置
[Redis]
Address = "127.0.0.1:6379"
Password = "YourRedisPassword"
RedisType = "standalone"
注意:数据库账号需具备建表权限,Nightingale 会自动初始化表结构。
日志配置(可选,但很重要)

3-1 mysql 脚本初始化

通过命令行、或者navicate 执行脚本。

3-2. 启动进程
./n9e
观察日志,记录下账号密码

验证:
ps -ef | grep n9e
ss -tlnp | grep 17000
日志查看:tail -f n9e.log
- 默认用户名:root
- 默认密码:root.2020
3-2 使用 systemd 管理(推荐)
创建 systemd 服务文件 /etc/systemd/system/n9e.service:
[Unit]
Description=Nightingale Monitoring Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/soft/watch_dog/nightingale/n9e/n9e
WorkingDirectory=/usr/local/soft/watch_dog/nightingale/n9e
Restart=always
RestartSec=5
StandardOutput=null
StandardError=null
SyslogIdentifier=n9e
[Install]
WantedBy=multi-user.target
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl enable n9e
sudo systemctl start n9e
登录
同上,访问 http://你的服务器IP:17000,使用默认账号 root / root.2020。

更改密码,进入页面,用户管理更改

集群模式
- 多台机器各自部署 n9e 二进制;
- 所有实例共享同一套 MySQL + Redis;
- 因此,所有节点的 config.toml 配置完全相同;
- 负载均衡由外部(如 Nginx、LVS)实现。
架构细节参见:夜莺架构设计
边缘模式
📌 请务必先阅读:边缘告警引擎架构详解
- 使用 n9e-edge 二进制(包含在主压缩包中);
- n9e-edge 需连接中心端 n9e,同步告警规则;
- 配置中需指定中心端地址。
边缘集群
-
可部署多个 n9e-edge 实例组成高可用集群;
-
同一集群内所有实例的 EngineName 必须相同;
-
中心端默认 EngineName = "default";
-
边缘端默认 EngineName = "edge";
-
若有多个边缘机房,建议分别命名为 edge1、edge2 等,以便区分数据源与告警引擎。
n9e-edge 启动
⚠️ 注意:需指定配置目录,而非配置文件!
nohup ./n9e-edge --configs etc/edge &> edge.log &
❌ 错误示例:--configs etc/edge/edge.toml(不能指向具体文件)
第三章 数据源
数据源
夜莺支持对接各类数据源,前期支持的数据源,比如 Prometheus、VictoriaMetrics、ElasticSearch 等,既支持查询看图,也支持告警。后面随着项目发展,夜莺定位为一个告警引擎,所以新对接的数据源,比如 ClickHouse、MySQL、Postgres 等,都是只支持告警,不支持查询看图。
不管是要查看数据源里的数据,还是对数据源里的数据进行告警,都需要先配置数据源。在 集成中心-数据源 中添加数据源,选择对应的数据源类型,填写数据源的地址、用户名、密码等信息,点击保存即可。

配置数据源时,除了要填写数据源的连接地址,另一个关键点是要选择关联的告警引擎,如果你的数据源是在边缘机房的,并且为边缘机房搭建了专属的 n9e-edge,那么就选择对应的 n9e-edge 作为关联的告警引擎。
数据源配置中,表单各项基本都对应有 tooltip(就是各个 form 表单旁边的小问号 icon,鼠标放上去可以看到用法提示),这里就不再赘述了。
配置完了数据源之后,可以到即时查询页面查询一下时序库的数据,如果能查到数据,则表明数据源的配置是 OK 的。
常见问题
-
夜莺的配置文件 config.toml 中已经配置了数据源的 writer 地址,是否还需要在页面上重复配置?
是的。config.toml 中的 writer 地址,是用于数据转发链路,而页面上的数据源配置,是用于查询和告警的。两者是不同的概念。另外,writer 地址应该是一个 remote write 地址,而页面上的数据源配置通常是数据源的基准地址。另外,很多用户也没有使用夜莺转发监控指标,所以也就没有配置 config.toml 中的 writer 地址,仅配置了页面上的数据源。
-
我想采用边缘模式对边缘机房的时序库做告警,但是中心端的 n9e 无法连通边缘的时序库,这种情况还能用夜莺做统一告警吗?
可以。这类边缘时序库,仍然需要在页面上添加,添加的时候选择「保存」而非选择「测试并保存」,这样一来,中心端的夜莺就不会校验连通性,可以直接保存成功。同时,数据源配置的时候,要配置上时序库内网地址,告警引擎选择和时序库能连通的 n9e-edge 告警引擎,届时 n9e-edge 会使用时序库内网地址进行查询和告警。
这种情况的边缘时序库,仍然可以告警,但是在夜莺的页面上就没法查询其数据了。因为夜莺的页面查询数据是通过中心端的 n9e 进行的,而中心端的 n9e 无法连通边缘时序库,所以无法查询。
更改时序数据库配置,导入Prometheus数据源
修改配置文件: n9e/etcconfig.toml
编写【更改时序数据库】Prometheus的write地址:
# 首先确保Prometheus开启--web.enable-remote-write-receiver参数
vim etc/config.toml
[[Pushgw.Writers]]
# Url = "http://127.0.0.1:8480/insert/0/prometheus/api/v1/write"
Url = "http://127.0.0.1:9090/api/v1/write"
# Basic auth username
BasicAuthUser = "admin"
# Basic auth password
BasicAuthPass = "password"

点击 集成中心-->数据源-->新增-->选择Prometheus

填写相关数据,若Prometheus无密码则不需要填写授权信息:


点击 【测试并保存】:

步骤操作:
- 选择服务器
- 批量操作
- 修改业务组
- 归属业务组(Default Busi Group)


测试即时查看:

有数据的时候,功能其实和Prometheus的这个一样:

我的暂时没有数据:

配置仪表盘
V8.0 版本
数据查询->仪表盘->Default Busi Group->导入

监控服务服务器就选linux


进入到视图后,还可以再自定义图表

进入到视图后,还可以再自定义图表

配置完保存,图表就能添加了一个监控展示指标
创建告警规则 (不推荐新增,推荐导入内置的)
-
告警→规则管理→新增,稍等半分钟左右,观察是否有告警信息 (不推荐新增)
另外推荐: 夜莺有提供了很多常用的告警模板,可直接使用内置规则即可(直接看2.)

选择指标:

指定指标阈值: node_memory_MemAvailable_bytes




和 Prometheus 页面看到的一样


点击【保存】:
- 夜莺有提供了很多常用的告警模板,可直接使用内置规则即可


可点击进去查看和修改具体的配置大小

点击导入

点击进去,修改 : 如、这个内存利用率,都可按需和提示配置,使用大于号和小于号做比较
例:


夜莺系统开启API认证
问题:在Linux系统中执行以下命令,注意将N9E替换为实际的夜莺服务地址,之后浏览器登录夜莺系统,在基础设施 → 业务组 → 全部机器中可以看到一台名为testHost001的机器,也就是说只要通过夜莺系统的heartbeat请求,就能够上报数据到夜莺系统的监控中,这样很不安全,正式环境下必须开启API认证
curl -X POST http://N9E/v1/n9e/heartbeat -H "Content-Type: application/json" -d '{"hostname":"testHost001"}'
# 返回内容
{"dat":null,"err":""}
修改 n9e/etc/config.toml 配置文件
[HTTP.APIForAgent]
# 开启API认证,这里默认就是true
Enable = true
[HTTP.APIForAgent.BasicAuth]
# 认证用户和密码
userName = "password"
重启n9e
systemctl restart n9e
systemctl status n9e
再次发送heartbeat请求,发现请求没有任何返回,testHost001机器也没有添加到夜莺系统监控中。
由于夜莺系统配置了API认证,因此也要修改categraf的配置文件 categraf/categraf-v0.3.83-linux-amd64/conf/config.toml,将basic_auth_user和basic_auth_pass与夜莺系统的认证信息保持一致
[[writers]]
url = "http://127.0.0.1:17000/prometheus/v1/write"
basic_auth_user = "userName"
basic_auth_pass = "password"
[heartbeat]
enable = true
url = "http://127.0.0.1:17000/v1/n9e/heartbeat"
basic_auth_user = "userName"
basic_auth_pass = "password"
重启categraf,登录夜莺系统,观察是否能够正常收集到数据
systemctl restart categraf
systemctl status categraf
发送告警消息
1. 使用短信
2. 使用钉钉
3. 使用HTTP API 统一接收夜莺告警事件
可使用该回调地址接收告警内容,做自定义的短信通知等等。传参的格式是json,需自行处理转化

json转化为中文示例
public static String convertN9eAlertToChineseSms(String jsonAlert){
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode root = mapper.readTree(jsonAlert);
StringBuilder sms = new StringBuilder();
// 1. 告警基本信息
sms.append("【告警通知】\n");
sms.append("规则名称: ").append(getText(root, "/rule_name")).append("\n");
sms.append("告警等级: ").append(parseSeverity(root.get("severity").asInt())).append("\n");
sms.append("触发时间: ").append(DateUtil.formatTimestamp(root.get("trigger_time").asLong())).append("\n");
// 2. 指标详情
sms.append("\n▌指标详情\n");
sms.append("监控对象: ").append(getText(root, "/target_ident")).append("\n");
sms.append("当前值: ").append(getValueWithUnit(root)).append("\n");
sms.append("阈值条件: ").append(getText(root, "/prom_ql")).append("\n");
// 3. 主机信息(从target对象提取)
JsonNode target = root.path("target");
sms.append("\n▌主机信息\n");
sms.append("IP地址: ").append(getText(target, "/host_ip")).append("\n");
sms.append("内存利用率: ").append(target.path("mem_util").asDouble()).append("%\n");
sms.append("CPU利用率: ").append(target.path("cpu_util").asDouble()).append("%\n");
return sms.toString();
} catch (Exception e) {
log.error("夜莺短信提醒异常",e.getMessage(), e);
return null;
}
}
告警自愈
告警自愈是夜莺的一个高级功能,可以在告警事件产生之后,自动执行一些命令,比如重启服务、清理磁盘、清理无用镜像、抓取现场、自动拉群等。
前提
需要使用 categraf 作为单机采集器,并且在 categraf 的配置中 enable ibex 功能。其次,要在服务端部署 ibex 模块,并且告诉夜莺 ibex 的地址,菜单入口:告警自愈 - 配置,后面我们计划升级把 ibex 的功能揉到夜莺里,这样就不用额外部署这个 ibex 模块了。
更新:如果你看到夜莺的 config.toml 中已经有如下配置,说明 ibex 模块已经揉进夜莺二进制了,无需额外部署 ibex 模块了:
[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"
脚本
配置自定义脚本。相当于一个任务模板,基于脚本创建任务时会自动填充相关字段。告警规则中可以配置回调地址为 ${ibex}/345,其中 345 这个数字表示脚本的 ID,告警事件产生之后,会把告警事件的信息传给脚本,脚本去做一些自动化的动作。去哪个机器执行?就是去告警的机器执行,告警自愈场景下,会忽略脚本中默认配置的机器列表。下图是一个脚本的详情页面:

自愈脚本里是不用写机器列表的,告警之后夜莺会自动把告警的那个机器的标识填充到任务的机器列表里。
第二章、部署采集器Categraf

1 下载安装包
[root@localhost watch_dog]# wget https://github.com/flashcatcloud/categraf/releases/download/v0.4.35/categraf-v0.4.35-linux-amd64.tar.gz

2 安装采集器
## 解压安装包进入安装目录
tar -zxvf categraf-v0.4.5-windows-amd64.tar.gz && cd categraf-v0.4.5-linux-amd64
## 以service方式安装, 相当于添加service文件+systemctl daemon-reload
sudo ./categraf --install
# 以service方式查看categraf,相当于systemctl status categraf
sudo ./categraf --status

3 修改配置文件
## 进入安装目录下的conf目录
cd categraf-v0.4.5-linux-amd64/conf
修改配置文件
vim config.toml
修改以下字段
[global]
# 机器名,作为本机的唯一标识,会为时序数据自动附加一个 agent_hostname=$hostname 的标签
hostname = ""
[writer_opt]
[[writers]]
# 注意端口号
# v5版本端口是19000
# v6+版本端口是17000,将127.0.0.1替换为你的夜莺安装服务器IP
url = "http://127.0.0.1:17000/prometheus/v1/write"
## 完成后重启采集器
systemctl restart categraf
## 查看重启后的采集器状态
systemctl status categraf

4 查看采集器
登录夜莺监控,一切正常的话,可以看到被监控服务器的采集数据
http://192.168.21.18:17000/notification-channels
