夜莺 Nightingale
一、简介
1. 介绍
夜莺(Nightingale)作为一款开源云原生监控工具,最初由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。
是一款开源的分布式监控系统,专注于服务器资源监控与告警管理。它整合了数据采集、存储、可视化、告警等功能,支持云原生环境,适合中小企业的运维团队。通过夜莺,用户可以构建从基础设施到业务层的全方位监控体系,并实现自动化告警响应,显著提升运维效率。
2. 夜莺的核心架构
夜莺采用模块化设计,主要组件包括:
-
Agent(客户端)
-
部署在被监控的服务器上,负责采集主机指标(如CPU、内存、磁盘、网络等)。
-
支持插件机制,可扩展采集自定义指标(如Nginx、MySQL、JVM等)。
-
默认通过 telegraf 或 Categraf(夜莺自研的高性能Agent)采集数据。
-
-
服务端(Server)
-
数据接收:接收Agent上报的监控数据,支持Prometheus的Remote Write协议。
-
数据存储:通常对接时序数据库(如Prometheus、InfluxDB、VictoriaMetrics),长期存储指标数据。
-
告警引擎:基于配置的规则触发告警,支持阈值判断、表达式计算等。
-
-
前端(Web UI)
-
提供可视化仪表盘、告警配置、策略管理、用户权限控制等功能。
-
支持自定义监控大盘,灵活拖拽图表。
-
-
告警通知中心
-
集成多种通知渠道:邮件、企业微信、钉钉、Slack、Webhook等。
-
支持告警静默、分级告警、告警合并(去重)等功能。
-
3. 监控的服务器资源类型
夜莺通过Agent自动采集以下核心指标:
-
CPU
- 使用率、负载(1/5/15分钟)、上下文切换次数等。
-
内存
- 总内存、已用内存、缓存、Swap使用情况。
-
磁盘
- 分区容量、IOPS、读写吞吐量、磁盘延迟。
-
网络
- 带宽使用率、TCP连接数、丢包率、端口状态。
-
进程
- 进程存活状态、资源占用(CPU、内存)、线程数。
-
其他自定义指标
- 通过插件或脚本采集应用层指标(如数据库查询性能、HTTP请求延迟等)。
二、安装部署
2.1、部署夜莺平台
参考链接: https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/introduction/
本次搭建使用二进制部署,官方推荐方式
-
安装须知
- 安装夜莺平台需安装mysql 和 redis,如只安装采集器则不需要
- 选择一台服务器安装夜莺、时序库、采集器,其他服务器只需安装采集器即可
- 默认使用17000、8428、20900端口,如有冲突根据实际情况修改
- 新建nightingale文件夹,将包传入服务器,并解压
tar -zxvf n9e-v8.0.0-beta.6-linux-amd64.tar.gz
- 需将n9e.sql文件导入到mysql数据库中
5. 更改Nightingale配置,进入etc目录,更改config.toml
vim etc/config.toml
我们直接使用线上生成环境方式部署,需要配置mysql、redis
5.1、放开mysql注释,更改mysql连接信息
MySQL 用于存储用户、监控大盘、告警规则等
5.2、更改redis连接
存放访问令牌(JWT Token),心跳信息,如机器列表中CPU、内存、时间偏移、核数、操作系统、CPU架构等。
5.3、更改时序数据库配置端口
[[Pushgw.Writers]]
Url = "http://127.0.0.1:9090/api/v1/write"
[[Pushgw.Writers]]
Url = "http://127.0.0.1:8428/api/v1/write"
更改完毕,保存config.toml配置。
- 启动夜莺
nohup ./n9e &> n9e.log &
- 开放防火墙
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="需访问夜莺主机ip" port port="17000" protocol="tcp" accept"
# 重载防火墙配置
firewall-cmd --reload
8.登录夜莺
web输入对应主机ip:17000
账号:root
密码:root.2020
本次部署是v8.0版本,暂不用更改key,以下版本记得改密钥、密码,并且端口不要暴露公网
更改密码,进入页面,用户管理更改
2.2、部署时序库
注意事项:
- 时序库下载地址为外网,无法登录自行想办法
- 时序库需下载文件命名规则为:(victoria-metrics-系统-架构-版本号.tar.gz)
- 如时序库版本号后跟-enterprise请勿下载,该命名规则包为企业版安装需要校验码
找这种版本号没有后缀的
2. 安装
丢至服务器目录下,解压
tar -zxvf victoria-metrics-linux-amd64-v1.112.0.tar.gz
解压出来就是个二进制文件,可直接运行,默认端口是8428
nohup ./victoria-metrics-prod &> vm.log &
对开放防火墙
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="需访问时序库主机ip" port port="8428" protocol="tcp" accept"
firewall-cmd --reload
登录时序库
web输入对应主机ip:8428
2.3、部署采集器
Categraf 是一个开源的监控采集 Agent,类似 Telegraf、Grafana-Agent、Datadog-Agent,希望对所有常见监控对象提供高质量的监控数据采集能力,采用了 All-in-one 的设计理念,可以同时支持指标、日志、链路追踪数据的采集
对于要监控的目标机器,需要在每个机器上安装 Categraf
,Categraf 是夜莺的数据采集器
2. 解压
tar -zxvf categraf-v0.4.3-linux-amd64.tar.gz
- 进入解压后文件夹,更改配置
cd categraf-v0.4.3-linux-amd64
vim conf/config.toml
- 更改config.toml连接夜莺平台信息
[global]
hostname = "夜莺上显示的机器名自行修改"
名称可自行更改
[[writers]]
url = "http://部署夜莺服务器ip:17000/prometheus/v1/write"
[heartbeat]
url = "http://部署夜莺服务器ip:17000/v1/n9e/heartbeat"
- 安装采集器
./categraf -install
注意安装夜莺平台的服务器,需要开放端口给采集器的服务器
- 启动采集器
nohup ./categraf -start
三、配置夜莺监控
3.1、配置数据源
集成中心->数据源->新增->Promettheus Like
配置内容:
- 名称(自行定义)
- URL(http://127.0.0.1:8428/)
- Remote Write URL(http://127.0.0.1:8428//api/v1/write)
- 时序库类型(VictoriaMetrics)
3.2、配置基础设施
基础设施->机器列表->全部机器
步骤操作:
- 选择服务器
- 批量操作
- 修改业务组
- 归属业务组(Default Busi Group)
3.3、配置仪表盘
仪表盘->监控仪表盘->Default Busi Group->导入
监控服务服务器就选linux
进入到视图后,还可以再自定义图表
配置完保存,图表就能添加了一个监控展示指标
四、告警通知
4.1、配置告警规则
告警管理->告警规则->Default Busi Group->导入
夜莺有提供了很多常用的告警模板,可直接使用内置规则
即可,
可点击进去查看和修改具体的配置大小
如这个内存利用率,都可按需和提示配置,使用大于号和小于号做比较
4.2、使用企微通知媒介发送告警消息
-
创建一个企业微信群机器人
创建一个微信群,然后在群里添加一个群机器人,可以得到一个 Webhook 地址,如下所示:
-
创建一个夜莺用户
在夜莺里创建一个用户,代表这个企微群机器人,如下所示:
创建用户时,在 wecom_robot_token 中填写这个 Webhook 地址,或者只填写 url 最后面那个 key 也行。
-
创建一个团队
可以新建一个团队,把刚才创建的用户加入到这个团队中。当然,在 邮件推送 章节我们已经创建过团队了,我们复用那个团队也可以,把新建的这个用户加入到那个团队中。
4. 配置告警规则
为了便于测试,我新建一条告警规则,设置 promql:mem_available_percent < 100,并且指定通知媒介是企微(wecom),告警接收人复用之前创建的团队:测试邮件告警的团队。
- 查收企微消息
- 更改通知模板
告警通知——》 通知模板更改
4.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,告警事件产生之后,会把告警事件的信息传给脚本,脚本去做一些自动化的动作。去哪个机器执行?就是去告警的机器执行,告警自愈场景下,会忽略脚本中默认配置的机器列表。下图是一个脚本的详情页面:
自愈脚本里是不用写机器列表的,告警之后夜莺会自动把告警的那个机器的标识填充到任务的机器列表里。