夜莺 Nightingale —— 兼容 Prometheus 生态、集告警与可视化于一体的国产开源观测平台
夜莺 Nightingale —— 兼容 Prometheus 生态、集告警与可视化于一体的国产开源观测平台
分类:03 一体化监控平台 适用:物理机、虚机、云主机、容器与 K8s、网络设备、数据库/中间件/日志;几十台到数万时间线规模 一句话:不绑定存储、只做「数据源接入 + 告警判定 + 事件路由 + 可视化」,Categraf 采集、Prometheus/VictoriaMetrics 存储 官方:https://github.com/ccfos/nightingale | https://n9e.github.io/ | https://flashcat.cloud/ 授权:Apache-2.0,完全开源;商业支持/增值功能由快猫星云提供
1. 它解决什么问题
| 痛点 | 对应能力 |
|---|---|
| Prometheus + Alertmanager + Grafana 三套割裂、协同难 | 一体化 n9e:数据源管理、告警规则、屏蔽/订阅、通知、大盘在一个 Web 里 |
| 改 YAML/配置文件管理告警,学习曲线陡 | 页面化配置告警规则、PromQL 即时查询、内置大盘与规则模板一键导入 |
| 单机 Prometheus 性能/容灾不足,多套集群管理成本高 | 对接 VictoriaMetrics / Thanos / M3DB 等,多数据源集中管理、告警引擎可横向扩展 |
| Zabbix 数据模型难适配云原生高基数、短生命周期对象 | 原生 PromQL + 标签模型,支持 Categraf / Telegraf / exporter / Prometheus 上报 |
| 告警无业务组归属、无值班路由与自愈 | 业务组权限、通知规则分级、告警自愈回调(ibex)、历史事件追溯 |
| 已有 Grafana 大盘不想重做 | 可导入 Grafana 仪表盘;也可保留 Grafana,夜莺只做告警中心 |
不擅长:并非时序数据库(须外接 TSDB);SNMP 自动发现弱于 Zabbix;纯日志检索需接 Loki/Elasticsearch。
⚠️ 版本差异务必先看 2.3:v5 与 v6+ 架构完全不同,配置文件名、模块名、数据库 schema 均不通用;跨大版本升级先读官方 Upgrade 文档。
2. 核心概念与架构
2.1 术语表
| 术语 | 含义 |
|---|---|
| n9e(Server) | 核心服务:Web/API + 数据转发(Pushgw)+ 告警引擎,v6+ 单模块一体化 |
| Categraf | 官方默认采集器,All-in-one,支持 metric/log/trace,remote write 上报 |
| 数据源(Prometheus Like) | 兼容 Prometheus 查询 API 的后端:VictoriaMetrics、Prometheus、Thanos 等 |
| Pushgw.Writers | config.toml 中上报数据的转发目标(如 VM 的 /api/v1/write),与页面数据源是两回事 |
| 业务组(Busi Group) | 告警规则、仪表盘、机器对象的归属与权限边界 |
| 告警规则 / PromQL | 基于数据源执行 PromQL、持续时长、附加标签,判定后生成告警事件 |
| 通知规则 / 通知媒介 / 消息模板 | 事件到渠道的路由、渠道凭据、渲染模板(邮件、企微、钉钉、Webhook) |
| 屏蔽规则 / 订阅规则 | 静默抑制 / 按条件把事件分派给指定团队 |
| 告警自愈(ibex) | 告警触发后回调脚本/Webhook 自动处置,RPC 端口 20090 |
| Metadata DB / Redis | MySQL 或 PostgreSQL 存配置与事件;Redis 存会话、心跳与告警状态缓存 |
2.2 组件与数据流
被监控机/容器/应用 ─▶ Categraf(input.* 插件)/exporter/Telegraf/Prometheus
│ remote write :17000/prometheus/v1/write ▲ 心跳 :17000/v1/n9e/heartbeat
▼
┌──────────────────── n9e Server(v6+ 单进程) ────────────────────┐
│ Web/API ─▶ MySQL/PostgreSQL(规则/用户/事件) │
│ Pushgw ─▶ [[Pushgw.Writers]] ─▶ 时序库 │
│ 告警引擎 ─ PromQL 查时序库 ─▶ 判定 ─▶ 事件 ─▶ 通知规则 ─▶ 通知媒介 │
│ ▲ 从 DB 同步规则 └─▶ 自愈 ─▶ ibex(20090)/Webhook │
└──────────┬──────────────────────────┬─────────────────────────────┘
▼ ▼
VictoriaMetrics:8428 / Prometheus:9090 / Thanos / ES / Loki
通知:邮件 / 企业微信 / 钉钉 / 飞书 / Webhook / 自愈回调
- 链路:Categraf → n9e Server →(Pushgw.Writers 转发)时序库;告警引擎按周期从 DB 同步规则 → 查时序库 → 判定生成事件 → 通知规则路由到媒介。
- 与 Prometheus 生态关系:夜莺不存储指标,是「兼容层 + 告警/可视化中心」。直接接已有 Prometheus/VictoriaMetrics 作数据源、用原生 PromQL,也可让 Categraf 直接 remote write 到 VM,因此 Grafana 大盘可原样保留;
[[Pushgw.Writers]]支持多 Writer 双写用于迁移(以官方文档为准)。
2.3 版本架构差异(选型/升级前必读)
| 版本 | 架构 | 配置与要点 |
|---|---|---|
| v5.x | 至少 n9e-webapi(无状态中心,前端请求写 DB)+ n9e-server(告警引擎 + 数据转发,跟随 TSDB,每套依赖 Redis);边缘机房各部署一套 server | 两个二进制、两套配置;内置大盘需导入业务组;角色只能改 DB 创建 |
| v6.x | 合并 webapi + pushgateway + alerting 为单一 n9e 模块,可对接多数据源、可多实例集群;另提供可选 n9e-pushgw(转发网关)与 n9e-alert(告警引擎)用于弱网/边缘下沉 |
单个 etc/config.toml;新增 Elasticsearch 数据源、内置大盘浏览页、内置告警规则;SSO/模板/角色改为页面管理;schema 名为 n9e_v6 并沿用 |
| v7.x | 在 v6 一体化基础上迭代,组件形态不变 | 以该版本 Release Notes 为准 |
| v8.x | 继续一体化架构(社区常见二进制部署如 n9e-v8.*-linux-amd64.tar.gz) |
[HTTP.APIForAgent] BasicAuth 加固上报链路;[[Pushgw.Writers]] 写法同上 |
| v9.x | 一体化 + 内置 AI agent / MCP server,配置出现 [EmbeddedTSDB](仅适合单副本)、[HTTP.TokenAuth](/mcp、/a2a 需要),默认关闭 PromQL 匿名访问 |
Helm chart master 跟踪 v9;仓库 README 已含 AI/MCP;具体版本号以官方最新稳定版为准 |
当前主线为 v8 / v9,且 v9 与 v6 配置项已有增减。本文命令按 v6+ 通用形态书写,凡涉及
[EmbeddedTSDB]、[HTTP.TokenAuth]、AI/MCP 等只属于特定版本的项,一律以对应版本官方文档/Release Notes 为准。
3. 安装与部署
版本号、镜像 tag、包名一律 以官方最新稳定版为准(https://github.com/ccfos/nightingale/releases);`<xxx>` 为占位符。Docker Compose 的 host-network 套件仅 Linux 可用。
3.1 环境准备
| 项 | 要求 |
|---|---|
| 依赖 | MySQL 8 / PostgreSQL 12(元数据库)、Redis(会话/心跳/告警缓存)、时序库(VictoriaMetrics 或 Prometheus) |
| 端口 | 17000(Web/API/remote write)、20090(ibex 告警自愈 RPC)、3306/5432(DB)、6379(Redis)、8428(VM)、9090(Prometheus) |
| 数据库 / 时间 | 预建库 n9e_v6(compose 由 docker/initsql/ 自动建);全节点 NTP 同步,心跳与告警判定依赖时间一致 |
| 容器 | Docker + Compose;compose-bridge 通过 WAIT_HOSTS=mysql:3306,redis:6379 等待依赖就绪 |
| 信创适配 | Go 静态编译,可在麒麟/统信 + 鲲鹏/飞腾(arm64)、海光/兆芯(amd64) 运行;国产数据库需验证 MySQL/PG 兼容模式,以官方文档为准 |
3.2 多种安装方式
方式 A:官方 Docker Compose(最快,含全套依赖)
git clone https://github.com/ccfos/nightingale.git
cd nightingale/docker/compose-bridge && docker compose up -d && docker compose ps
# 打开 http://localhost:17000 ,默认 root / root.2020
该套件拉起 5 个容器:mysql:3306(n9e_v6)、redis:6379、victoriametrics:8428、nightingale:17000/20090、categraf;配置目录挂载 ./etc-nightingale:/app/etc,改 config.toml 后 docker compose restart nightingale 生效。另有 compose-postgres(PG 元数据)、compose-host-network(MySQL+Prometheus,Linux host 网络)、compose-host-network-metric-log(含 Kafka/ES/Logstash)。
方式 B:二进制 + systemd(生产/信创常用)
mkdir -p /opt/monitor/n9e && tar zxvf n9e-v<版本>-linux-amd64.tar.gz -C /opt/monitor/n9e
mysql -uroot -p<密码> -e "CREATE DATABASE n9e_v6 DEFAULT CHARACTER SET utf8mb4;"
# 导入包内 initsql/ 初始化 SQL(以包内文件为准);再编辑 etc/config.toml(见第 4 章)
# /etc/systemd/system/n9e.service
[Unit]
Description=Nightingale Monitoring Service
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/monitor/n9e
ExecStart=/opt/monitor/n9e/n9e
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable --now n9e && systemctl status n9e
方式 C:Categraf 采集器(每台被监控机)
mkdir -p /opt/categraf && cd /opt/categraf
tar xzf categraf-v<版本>-linux-amd64.tar.gz --strip-components=1
sudo ./categraf --install && sudo ./categraf --start # 等价 --remove/--stop/--status
方式 D:Helm / K8s(社区 chart)
git clone https://github.com/flashcatcloud/n9e-helm.git
helm install nightingale ./n9e-helm -n n9e --create-namespace && kubectl get pod -n n9e
⚠️ 监控是 P0 系统,装进被监控的 K8s 会形成循环依赖;生产建议独立集群或集群外二进制部署。chart master 跟踪 v9,包仓库可能仍是 v8,以官方 chart 说明为准。
3.3 首次启动与验证
systemctl status n9e && ss -lntp | grep -E '17000|20090' # 或 docker compose ps
curl -fsS http://127.0.0.1:8428/health # VM 探活
curl -G -fsS http://127.0.0.1:8428/api/v1/query --data-urlencode 'query=up'
# Web http://<主机>:17000 root/root.2020 登录后立即改密码
# 集成中心→数据源→新增「Prometheus Like」URL http://<VM_IP>:8428/ → 测试并保存
# 数据查询→即时查询选该源查 up;基础设施→设备列表看 Categraf 上线及 CPU/内存
4. 配置文件详解
4.1 主配置路径与关键项
| 路径 / 段 | 说明 |
|---|---|
etc/config.toml(二进制)/ ./etc-nightingale/config.toml(compose) |
n9e 主配置,改后重启生效 |
[DB] DBType / DSN |
mysql 或 postgres;DSN 形如 root:1234@tcp(mysql:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true |
[Redis] RedisType / Address / Password |
standalone(另有 cluster/sentinel,以官方配置为准);compose 为 redis:6379 |
[[Pushgw.Writers]] Url |
上报数据的转发目标,如 http://victoriametrics:8428/api/v1/write;可多段做双写 |
[Pushgw] LabelRewrite |
是否重写标签,v6 文档示例中为 true |
[HTTP.APIForAgent] Enable |
开启 agent 接口 BasicAuth 后,Categraf 的 writers/heartbeat 需填 basic_auth_user/basic_auth_pass |
[HTTP.APIForAgent.BasicAuth] |
键值形式写用户名=密码(随机串示例见官方实践) |
[EmbeddedTSDB] |
仅 v9 等版本出现,内嵌 TSDB 只适合单副本;compose 套件因已有 VM 而不含此段 |
[HTTP.TokenAuth] |
v9 用于 /mcp、/a2a 的令牌鉴权,按需开启 |
WAIT_HOSTS |
compose 环境变量,启动前等待 mysql:3306,redis:6379;写入端点 :17000/prometheus/v1/write、心跳端点 :17000/v1/n9e/heartbeat |
4.2 完整可运行最小示例(config.toml)
# 以 MySQL + Redis + VictoriaMetrics 为例,密码与地址均为占位符
[DB]
DBType = "mysql"
DSN = "<user>:<pass>@tcp(127.0.0.1:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
[Redis]
RedisType = "standalone"
Address = "127.0.0.1:6379"
Password = "<redis_pass>"
[Pushgw]
LabelRewrite = true
[[Pushgw.Writers]]
Url = "http://127.0.0.1:8428/api/v1/write"
[HTTP.APIForAgent]
Enable = true
[HTTP.APIForAgent.BasicAuth]
<agent_user> = "<agent_pass>"
改后
systemctl restart n9e && journalctl -u n9e -f校验。⚠️ compose 套件里root:1234同时写在 compose 与 config.toml 两处,上生产前必须改;开启APIForAgent.BasicAuth后未配凭证的 Categraf 会停心跳。
5. 核心使用方法(CLI / HTTP API / Web UI)
5.1 命令与操作速览(≥20 条)
| # | 命令 / 路径 | 用途 |
|---|---|---|
| 1 | systemctl start|stop|restart|status n9e |
n9e 服务生命周期 |
| 2 | journalctl -u n9e -f |
实时看 n9e 日志 |
| 3 | docker compose up -d|ps|restart nightingale|down |
compose 全家桶管理 |
| 4 | ./categraf --install|--remove |
注册/卸载 systemd 服务 |
| 5 | ./categraf --start|--stop|--status |
采集器启停与状态 |
| 6 | ./categraf --test |
试跑一次,打印将要上报的指标(校验配置) |
| 7 | ./categraf --configs ./conf |
指定配置目录启动(用绝对路径,进程会 chdir 到二进制所在目录) |
| 8 | ./categraf --version |
查看版本(以本机 --help 为准) |
| 9 | vi conf/config.toml |
配 writers 与 heartbeat(见 5.2) |
| 10 | vi conf/input.http_response/http_response.toml |
启用某采集插件(目录名 input.* 前缀即开关) |
| 11 | curl -fsS http://127.0.0.1:8428/health |
时序库健康检查 |
| 12 | curl -G http://127.0.0.1:8428/api/v1/query --data-urlencode 'query=up' |
PromQL 即时查询 |
| 13 | curl -G http://127.0.0.1:8428/api/v1/query_range --data-urlencode 'query=rate(node_cpu_seconds_total[5m])' |
区间查询 |
| 14 | mysql -u<user> -p<pass> n9e_v6 -e "show tables;" |
校验元数据库 |
| 15 | redis-cli -h 127.0.0.1 ping |
校验 Redis |
| 16 | Web:集成中心 → 数据源 → 新增「Prometheus Like」 | 接入时序库 |
| 17 | Web:数据查询 → 即时查询 / 指标视图 | PromQL 查数 |
| 18 | Web:告警规则 → 新增(业务组 + 数据源 + PromQL + 持续时间) | 配告警 |
| 19 | Web:通知媒介 / 通知规则 / 消息模板 | 配送达渠道与路由 |
| 20 | Web:屏蔽规则 / 告警事件 / 自愈 | 静默、追溯、回调 |
| 21 | Web:基础设施 → 设备列表(心跳);模板中心 / 导入 Grafana 仪表盘 | 确认 Categraf 上线、复用大盘与内置告警规则 |
| 22 | vector(1) > 0 且持续时间设 0 |
造一条必触发的测试告警 |
5.2 Categraf 配置(conf/config.toml)
[global]
hostname = "" # 留空自动取系统 hostname;同名机器多时务必显式指定
interval = 15 # 全局采集频率(秒)
providers = ["local"]
[global.labels] # 全局附加标签,用于分组/路由/检索
env = "prod"
[[writers]]
url = "http://<N9E_HOST>:17000/prometheus/v1/write"
basic_auth_user = "" # 服务端开启 APIForAgent.BasicAuth 时填写
basic_auth_pass = ""
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100
[heartbeat]
enable = true # 必须开,否则设备列表无此机器/元信息 unknown
url = "http://<N9E_HOST>:17000/v1/n9e/heartbeat"
interval = 10
./categraf --test校验指标输出;sudo ./categraf --start && --status启动。只关心跳与只关心 writers 的差别:关 heartbeat → 元信息 unknown;关 writers → 无指标;都关 → 设备列表无此机器。input.*目录改名(如bak.input.xx)即停用该插件;另有logs.toml、prometheus.toml、traces.yaml。
5.3 告警规则与自监控
- 告警规则:Web「告警规则」→ 选业务组与数据源 → 填 PromQL(如
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80)→ 设持续时间、附加标签、关联通知规则 → 保存。用vector(1) > 0可造必触发测试告警。 - 自监控:① 在 n9e / VM / MySQL / Redis 所在主机都部署 Categraf 采集系统指标;② 「模板中心」导入内置大盘与内置告警规则(含机器失联、时间偏移);③ 用心跳端点
/v1/n9e/heartbeat判采集器存活;④ 用curl -G http://<VM_IP>:8428/api/v1/query --data-urlencode 'query=up'验数据链路。具体自监控指标端点以对应版本官方文档为准。
6. 告警与通知
6.1 规则、静默与升级
| 需求 | 做法 |
|---|---|
| 阈值/规则 | PromQL 表达式 + 持续时间(for)+ 执行频率 + 附加标签(支持变量做二次处理) |
| 静默 / 订阅 / 路由 | 「屏蔽规则」按标签/时间窗抑制;「订阅规则」分派团队;通知规则按级别选媒介 |
| 升级 / 自愈 / 追溯 | 按级别路由媒介或 Webhook 到值班平台升级;自愈回调经 ibex(20090);规则求值记录/历史事件/通知结果三段可查 |
6.2 通知媒介示例
Web 路径:通知媒介 → 新增;通知规则 → 绑定媒介与消息模板;消息模板用变量渲染事件字段。
邮件:SMTP 主机/端口/账号/密码/发件人;企业微信:企业 ID / Secret / AgentID / 部门
钉钉/飞书:机器人 Webhook + 加签密钥;Webhook:回调 URL + 自定义 Header/Body(模板变量)
Slack / PagerDuty / Telegram:官方媒介列表中选择并填 Token
具体媒介类型与字段随版本增加,以「通知媒介」页面当前可选项与官方文档为准;Webhook URL 与 Secret 属敏感信息,勿写入公开配置库。测试链路:新增媒介 → 通知规则绑定 → 临时告警规则
vector(1) > 0、for=0 → 观察告警事件与消息到达后 ⚠️ 立即禁用/删除该测试规则。
7. 实战场景
场景一:从零搭「Categraf + n9e + VictoriaMetrics」并跑通第一条告警
- 目标 / 步骤:10 分钟内机器上线、指标可查、告警可达;compose 起全家桶 → 配数据源 → 配媒介/规则 → 造测试告警。
git clone https://github.com/ccfos/nightingale.git
cd nightingale/docker/compose-bridge && docker compose up -d
curl -fsS http://localhost:8428/health
# Web http://localhost:17000 root/root.2020
# 集成中心→数据源→新增 Prometheus Like,URL http://victoriametrics:8428/ 并测试保存
# 数据查询→即时查询查 up;基础设施→设备列表看 categraf 上线
# 通知媒介→Webhook;通知规则→绑定;告警规则→vector(1) > 0、for=0
- 验证:即时查询返回指标、设备列表在线、告警事件产生且收到测试通知。
- 回滚:⚠️ 禁用并删除测试告警规则;
docker compose down停容器但保留卷,删数据需手动删 volume。
场景二:二进制部署 + 外部 VictoriaMetrics + 上报链路 BasicAuth 加固
- 目标 / 步骤:n9e 与 VM 分离、仅允许带凭证采集器上报;配 n9e 指向外部 VM → 开
APIForAgent.BasicAuth→ Categraf 同步凭证。
# n9e:/opt/monitor/n9e/etc/config.toml
[DB]
DBType = "mysql"
DSN = "<user>:<pass>@tcp(127.0.0.1:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local"
[Redis]
RedisType = "standalone"
Address = "127.0.0.1:6379"
[[Pushgw.Writers]]
Url = "http://<VM_IP>:8428/api/v1/write"
[HTTP.APIForAgent]
Enable = true
[HTTP.APIForAgent.BasicAuth]
<agent_user> = "<agent_pass>"
# 每台 Categraf:conf/config.toml(writers 与 heartbeat 都要带凭证)
[[writers]]
url = "http://<N9E_HOST>:17000/prometheus/v1/write"
basic_auth_user = "<agent_user>"
basic_auth_pass = "<agent_pass>"
[heartbeat]
enable = true
url = "http://<N9E_HOST>:17000/v1/n9e/heartbeat"
basic_auth_user = "<agent_user>"
basic_auth_pass = "<agent_pass>"
systemctl restart n9e && sudo ./categraf --stop && sudo ./categraf --start
curl -G -fsS http://<VM_IP>:8428/api/v1/query --data-urlencode 'query=up' | head -c 300
- 验证:即时查询有数据、设备列表心跳恢复;未配凭证的采集器停止更新(鉴权生效)。
- 回滚:
[HTTP.APIForAgent] Enable = false并去掉 Categraf 的basic_auth_*后重启两端;⚠️ 回滚短暂允许匿名上报,仅在隔离内网操作。
场景三:机器失联告警 + 告警自愈(自动拉起 Categraf)
- 目标 / 步骤:心跳中断即告警并自动恢复采集器;导入内置「机器失联」规则 → 配自愈回调 → 验证事件与回调。
# Web:模板中心 → 导入「机器失联 / 时间偏移」内置规则;告警规则 → 关联通知规则(企微+邮件)
# 告警自愈:规则中配 Webhook 回调运维执行器,或经 ibex(20090) 下发脚本
# 脚本示意(由执行器调用,勿在 n9e 主机以 root 裸跑):
# systemctl is-active categraf || systemctl start categraf
sudo ./categraf --stop # 触发验证:Web 观察 CRITICAL + 通知 + 自愈回调
sudo ./categraf --start # 恢复验证:事件自动清除
- 验证:告警事件出现且通知/回调成功,恢复后事件自动清除。
- 回滚:屏蔽规则加维护窗口或停用该规则;⚠️ 自愈脚本限制可执行命令白名单,避免告警触发任意命令执行风险。
8. 日常运维与故障排查
| 操作 / 路径 | 命令 |
|---|---|
| n9e 服务 | systemctl start|stop|restart|status n9e |
| 日志 | journalctl -u n9e -f;compose 用 docker compose logs -f nightingale |
| Categraf / 时序库探活 | sudo ./categraf --status;curl -fsS http://127.0.0.1:8428/health |
| 配置备份 | tar czf n9e-etc.tgz /opt/monitor/n9e/etc;⚠️ 同时 mysqldump n9e_v6 备份元数据库 |
故障「现象 → 原因 → 处置」表
| 现象 | 原因 | 处置 |
|---|---|---|
| Web 17000 打不开 | n9e 未起 / WAIT_HOSTS 等不到 DB / 端口冲突 |
journalctl -u n9e;ss -lntp | grep 17000;确认 MySQL/Redis 先就绪 |
| 登录报 DB 错误 | config.toml 的 DSN 账号/库名错、库未建 |
核对 DSN、CREATE DATABASE n9e_v6、导入初始化 SQL |
| 设备列表无机器 | Categraf 心跳关了或 URL 错 | 开 [heartbeat] enable = true,核对 /v1/n9e/heartbeat |
| 元信息 unknown | 只配了 writers、没配 heartbeat | 补 heartbeat 配置后重启 Categraf |
| 有机器但无指标 | [[Pushgw.Writers]] 缺失/地址错、数据源未加 |
配 Writer 指向 /api/v1/write;页面新增 Prometheus Like 数据源 |
| 即时查询无数据 | 数据源 URL 填错(VM 单机查询根路径为 /) |
填 http://<VM_IP>:8428/ 并「测试连通性」;curl /api/v1/query?query=up 验证 |
| 告警不触发 / 通知不到 | 规则未关联通知规则、媒介凭据错、被屏蔽规则抑制 | 检查规则关联、通知媒介测试、屏蔽规则时间窗 |
| 开启 BasicAuth 后机器掉线 | Categraf 未同步 basic_auth_user/pass |
writers 与 heartbeat 两处都补凭证后 --start |
| 跨大版本升级后异常 / 时间轴错乱 | v5→v6 模块/schema 不通用;NTP 不同步 | 读官方 Upgrade 文档、先备份;全节点 chrony 同步后重启 |
9. 性能、容量与高可用
| 维度 | 说明 |
|---|---|
| 采集频率 | Categraf [global] interval = 15(秒),可按插件覆盖;频率越高时间线与存储线性增长 |
| 容量/保留 | 由后端时序库决定:VM -retentionPeriod=7d、-storageDataPath,Prometheus 用 --storage.tsdb.retention.time;以所选 TSDB 官方文档为准。时间线数 ≈ 主机数 × 每机指标数 × 标签基数,先实测 count(up) 与磁盘增速再扩容 |
| n9e 扩展 | Web 无状态可多实例 + Nginx/LB;告警引擎多实例组成集群(依赖同一 DB/Redis) |
| 边缘下沉 / 多数据源 | 弱网机房下沉时序库 + 可选 n9e-pushgw/n9e-alert;不同 Region 配多个 Prometheus Like 源,[[Pushgw.Writers]] 多段双写用于迁移/容灾 |
| 自监控 | Categraf 覆盖 n9e/VM/DB/Redis 所在主机;导入内置大盘与规则;心跳端点判活;重点监控 DB 连接数、Redis、Writer 积压 |
| HA 要点 | 元数据库与 Redis 做主从/高可用;时序库按 VM 集群或 Thanos 方案;⚠️ 告警引擎多实例时注意规则重复判定(以官方集群说明为准) |
10. 安全加固、备份与升级
| 项 | 做法 |
|---|---|
| 首次登录 | ⚠️ 立刻把默认 root / root.2020 改掉;compose 的 root:1234 数据库密码同步修改 |
| 上报鉴权 | [HTTP.APIForAgent] Enable = true + BasicAuth,Categraf writers/heartbeat 带凭证;避免公网裸暴露 17000 |
| TLS / 入口 | 前置 Nginx 终止 HTTPS;对外只暴露必要端口,17000/20090 收敛内网 |
| 最小权限 / 敏感信息 | DB 账号仅授权 n9e_v6;Categraf 以普通用户运行;通知媒介 Secret、Webhook Token、DSN 密码不进版本库 |
| 配置备份 | tar czf n9e-etc-$(date +%F).tgz /opt/monitor/n9e/etc(或 compose 的 etc-nightingale/) |
| 数据备份 | mysqldump -u<user> -p<pass> n9e_v6 > n9e_v6.sql(PG 用 pg_dump);时序库按 VM 快照工具备份;⚠️ 恢复前停 n9e |
| 升级 | 先读对应版本 Upgrade/Release Notes,备份 DB 与配置,按版本顺序逐步升级;v5→v6 属架构变更,不可直接替换二进制 |
| 回滚 | 停 n9e → 恢复 DB 与 etc → 启动上一版本二进制 → 验证登录与告警规则;⚠️ 跨大版本 schema 可能不向下兼容 |
| 信创适配 | Go 静态二进制适配麒麟/统信 + 鲲鹏/飞腾(arm64)、海光/兆芯(amd64);国产数据库需验证 MySQL/PG 兼容模式;整体链路(Categraf→n9e→VM)均可私有化离线部署 |
11. 常见坑(现象 → 原因 → 解决)
| # | 现象 | 原因 | 解决 |
|---|---|---|---|
| 1 | 照 v5 教程配 v6+ 全错 | 模块从 webapi+server 合并为单 n9e | 先确认版本,按 2.3 选对应文档;⚠️ 别混用配置模板 |
| 2 | 页面能配数据源却收不到指标 | [[Pushgw.Writers]] 没配,数据没转发到时序库 |
在 config.toml 补 Writer 指向 /api/v1/write 后重启 |
| 3 | Categraf 上线但无 CPU/内存 | 心跳开着、writers 关了或插件被禁用 | 检查 [[writers]];确认 conf/input.* 目录未被改名 |
| 4 | --configs ./conf 找不到配置 |
进程 chdir 到二进制目录,相对路径按二进制算 | 用绝对路径,或 cd 到二进制目录再启动 |
| 5 | 数据源测试失败 | VM 查询地址写成 /api/v1/write 或漏端口 |
单机 VM 查询地址填 http://<IP>:8428/;curl /health 先验证 |
| 6 | 开 BasicAuth 后机器集体掉线 | 只改了 writers,heartbeat 未带凭证 | writers 与 heartbeat 两处都补 basic_auth_* |
| 8 | network_mode: host 起不来 / 端口冲突 |
host 网络仅 Linux 支持;compose 把 3306/6379 发布到宿主机 | 改用 compose-bridge;改端口映射或先停本地 MySQL/Redis |
| 9 | 测试告警持续轰炸 | vector(1) > 0 未及时禁用 |
⚠️ 验证完立刻禁用/删除测试规则,或屏蔽规则加时间窗 |
| 10 | 升级后页面报错/规则丢失 | 跨大版本 schema 变化、未备份 | 按官方 Upgrade 逐步升级;恢复 DB 与 etc 回滚 |
| 11 | 机器同名 / 自愈执行危险命令 | hostname 留空重复;回调脚本无白名单 | [global] hostname 指定唯一值;⚠️ 限制可执行命令白名单,禁止把告警标签拼进 shell |
12. 速查表
| 类别 | 项 | 值 / 命令 |
|---|---|---|
| 端口 | Web/API / ibex / DB / Redis / VM | 17000 / 20090 / 3306·5432 / 6379 / 8428·9090 |
| 登录 | 默认账号 | root / root.2020(⚠️ 首次登录即改) |
| 配置 | n9e 主配置 / 元数据库 | etc/config.toml(compose ./etc-nightingale/)/ MySQL n9e_v6 或 PG |
| 配置 | 转发目标 / 上报鉴权 | [[Pushgw.Writers]] Url = "http://<VM>:8428/api/v1/write" / [HTTP.APIForAgent.BasicAuth] |
| 端点 | 指标写入 / 心跳 | POST :17000/prometheus/v1/write / POST :17000/v1/n9e/heartbeat |
| 端点 | VM 查询 / 写入 | /api/v1/query / /api/v1/write(VM 8428) |
| CLI | n9e 服务 | systemctl restart n9e |
| CLI | Categraf | ./categraf --install|--start|--stop|--status|--test |
| CLI | 指定配置 / 查询测试 | ./categraf --configs <绝对路径>;curl -G http://<VM>:8428/api/v1/query --data-urlencode 'query=up' |
| Web | 数据源 | 集成中心 → 数据源 → 新增「Prometheus Like」 |
| Web | 告警 / 通知 | 告警规则 / 通知规则 / 通知媒介 / 消息模板 |
| Web | 静默 / 追溯 / 自愈 | 屏蔽规则 / 告警事件 / 告警自愈 |
| 采集器 | Categraf 主配置 | conf/config.toml(writers + heartbeat + global.labels) |
| 仓库 | 主项目 / 采集器 / chart | ccfos/nightingale / flashcatcloud/categraf / flashcatcloud/n9e-helm |
| 测试 | 必触发告警 | vector(1) > 0、持续时间 0 |
13. 选型建议与同类对比
| 维度 | 夜莺 Nightingale | Zabbix | Prometheus + Alertmanager | Grafana |
|---|---|---|---|---|
| 定位 | 告警/事件/可视化一体化中心,不存储 | 全栈一体化(自带采集与存储) | 指标存储 + 告警引擎 | 可视化(不采集/存储) |
| 存储 | 外接 VM / Prometheus / Thanos / ES / Loki | 关系库 history/trends | 本地 TSDB | 取决于数据源 |
| 查询语言 | 原生 PromQL | 自研 Item/Trigger | PromQL | 取决于数据源 |
| 告警配置 | 页面化、业务组、屏蔽/订阅/通知规则/自愈 | Template/Action/Escalation | YAML 规则 + Alertmanager 路由 | 需配底座 |
| 采集器 / SNMP | Categraf + exporter;SNMP 弱于 Zabbix | Zabbix Agent / SNMP / IPMI 强 | exporter / snmp_exporter | — |
| 云原生/高基数 | 强(标签模型 + PromQL) | 弱 | 强 | 取决于后端 |
| 国产/信创 | 国产开源、中文文档、私有化友好 | 开源但非国产主导 | 海外主导 | 海外主导 |
何时选:已有或计划用 Prometheus/VictoriaMetrics,希望告警与事件管理页面化、按业务组分权、需要国产化/私有化与中文支持、想保留 Grafana 大盘只补一个告警中心。何时不选:只想装一个软件就完成采集+存储+绘图(选单机 Prometheus 或 Zabbix)、以 SNMP 网络设备与自动发现拓扑为核心(选 Zabbix)、不愿维护 MySQL+Redis+TSDB 三套外部依赖、团队已重度标准化在 Alertmanager YAML 流程上。
14. 参考链接
- GitHub 主仓库:https://github.com/ccfos/nightingale
- 官方文档(中/英):https://n9e.github.io/ | https://n9e.github.io/zh/docs/
- Docker Compose / Helm 安装文档:https://n9e.github.io/docs/install/compose | https://n9e.github.io/docs/install/helm
- Categraf 仓库与安装文档:https://github.com/flashcatcloud/categraf | https://n9e.github.io/zh/docs/agent/categraf
- v6 架构与升级说明:https://flashcat.cloud/blog/nightingale-v6-arch/ | https://flashcat.cloud/blog/nightingale-v6-release
- Releases(版本号以官方最新稳定版为准):https://github.com/ccfos/nightingale/releases