夜莺 Nightingale —— 兼容 Prometheus 生态、集告警与可视化于一体的国产开源观测平台

运维监控软件手册 03-一体化监控平台 19.9 KB 原文

夜莺 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. 参考链接

夜莺 Nightingale —— 兼容 Prometheus 生态、集告警与可视化于一体的国产开源观测平台 - 知识库 - 起航社区