Nightingale 自监控实战:用 Categraf Prometheus 插件采集 N9E /metrics 指标
【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale
Nightingale(夜莺)监控系统自身也通过标准的 Prometheus 文本格式暴露运行指标:从 V5 的 n9e-webapi、n9e-server,到 V6–V9 的 n9e 进程,以及边缘机房专用的 n9e-edge,都在/metrics端点提供自监控数据。本文基于仓库中 integrations/N9E/markdown/README.md 集成文档,完整讲解如何用 Categraf 的 prometheus 采集插件把 Nightingale 自身的健康指标接入监控体系,并给出可复制的配置、验证命令、关键指标清单与配套仪表盘,读完即可上手完成"监控系统监控自己"的闭环。
Nightingale 自监控指标端点:哪些进程暴露 /metrics
按照官方集成文档的说明,以下进程均通过/metrics暴露 Prometheus 指标:
| 版本 | 进程 | 说明 |
|---|---|---|
| V5 | n9e-webapi、n9e-server | V5 时代 WebAPI 与 Server 分离部署 |
| V6–V9 | n9e | 合并后的单一 n9e 进程 |
| 边缘场景 | n9e-edge | 边缘机房独立部署的 edge 进程,同样提供/metrics |
文档中的实际验证基于Nightingale V9 的自监控端点完成。也就是说,无论你部署的是哪个主版本,只要 n9e 进程在运行,就可以直接用 Categraf 的 prometheus 插件抓取,无需安装额外的 exporter——Nightingale 本身就是一个"自带 exporter"的监控系统。
从仓库的 Docker 编排配置可以印证默认端口:docker/compose-bridge/etc-nightingale/config.toml 中配置Port = 17000,docker/compose-bridge/etc-categraf/input.prometheus/prometheus.toml 中对应的抓取地址即为http://nightingale:17000/metrics。因此默认情况下/metrics端点就是http://127.0.0.1:17000/metrics,若自定义了 HTTP 端口请以实际配置为准。
采集配置:新建 n9e.toml
Categraf 的 prometheus 插件通过conf/input.prometheus/目录下的 TOML 文件定义抓取任务。按照集成文档,新建配置文件conf/input.prometheus/n9e.toml,内容如下:
[[instances]] urls = ["http://127.0.0.1:17000/metrics"] url_label_key = "instance" url_label_value = "{{.Host}}" labels = { job = "n9e" }各配置项的含义与作用如下:
[[instances]]:Categraf prometheus 插件以实例(instance)为抓取单元,每个实例对应一个或多个抓取目标,可在一个文件内配置多个[[instances]]段落;urls:抓取目标地址列表,填写 n9e 的/metrics端点。默认端口为 17000,若 n9e 的 HTTP 监听端口被修改(如 etc/config.toml 中的Port配置),需要同步调整;url_label_key/url_label_value:为抓取到的指标附加一个标签,用于标识数据来源。url_label_value = "{{.Host}}"使用 Categraf 的模板变量,把标签值动态设置为目标主机的 Host 标识,避免把机器名硬编码写死;labels = { job = "n9e" }:为所有抓取指标统一附加job="n9e"标签,便于在时序库中按业务维度聚合与检索。
多实例部署:全部纳入采集并保证 instance 唯一
如果环境中部署了多个 n9e 或 n9e-edge 实例(例如多机房、多套环境,或中心 + 边缘机房并存),应把每一个实例的/metrics地址都加入urls列表:
[[instances]] urls = [ "http://127.0.0.1:17000/metrics", "http://10.0.0.2:17000/metrics", "http://10.0.1.2:17000/metrics", ] url_label_key = "instance" url_label_value = "{{.Host}}" labels = { job = "n9e" }集成文档特别强调:必须把所有实例都配置上,并确保instance标签在全局唯一。这是因为后续告警规则、仪表盘往往按instance维度区分不同的 n9e 节点,如果两个实例的instance值相同,指标序列会互相覆盖或合并,导致监控数据失真。
抓取前的自检:curl 验证端点可用
配置完成并重启 Categraf 之前,先用以下命令确认服务端确实在暴露指标(文档给出的验证命令):
curl -fsS http://127.0.0.1:17000/metrics | head-f:HTTP 返回 4xx/5xx 时直接失败退出,避免把错误页当正常输出;-s:静默模式,不输出进度信息;-S:出错时显示错误信息,便于排查;| head:只查看前几行,确认输出为 Prometheus 文本格式(以# HELP、# TYPE注释行开头)即可。
如果 curl 返回空或连接失败,应优先检查 n9e 进程是否正常运行、HTTP 端口是否正确,以及防火墙/网络策略是否放行该端口。
抓取到的指标:认识 N9E 自监控指标体系
采集到的指标以n9e_为前缀,覆盖了数据接收、写入、队列积压、告警链路等关键环节。仓库中 integrations/N9E/dashboards/n9e_server.json 的仪表盘面板给出了最核心的一组指标及其使用方式:
| 指标 | 类型 | 面板/表达式 | 业务含义 |
|---|---|---|---|
n9e_pushgw_samples_received_total | Counter | rate(n9e_pushgw_samples_received_total[1m]) | 每秒接收到的数据点数量,衡量数据接入流量 |
n9e_pushgw_write_total | Counter | rate(n9e_pushgw_write_total[1m]) | 每秒写入 TSDB 的样本数量 |
n9e_pushgw_sample_queue_size | Gauge | 直接取值 | 内存数据队列长度,反映数据堆积情况 |
n9e_pushgw_http_request_duration_seconds_sum/count | Histogram | sum(rate(..._sum[5m])) / clamp_min(sum(rate(..._count[5m])), 0.001) | 数据接收接口的平均响应时间(单位:秒) |
n9e_pushgw_forward_duration_seconds_sum/count | Histogram | sum(rate(..._sum[5m])) / clamp_min(sum(rate(..._count[5m])), 0.001) | 把数据转发给 TSDB 的平均耗时(单位:秒) |
n9e_alert_alert_queue_size | Gauge | 直接取值 | 告警事件队列长度,反映告警处理链路是否积压 |
在使用建议上:_total结尾的 Counter 指标需要配合rate()或irate()求速率才有意义;两个 Histogram 类型的耗时指标除以计数即可得到平均延迟,公式中使用clamp_min(..., 0.001)是为了避免分母为 0 导致除零。若队列类 Gauge 指标(n9e_pushgw_sample_queue_size、n9e_alert_alert_queue_size)持续走高,通常意味着下游写入或告警处理能力不足,需要扩容或排查瓶颈。
与 pushgw 代理模式相关的扩展指标
如果使用了 pushgw 的代理写模式(/proxy/v1/write),doc/api/pushgw-proxy-write.md 中还有一组专门的观测指标可一并关注:
n9e_pushgw_proxy_remote_write_total(Counter):接收到的/proxy/v1/write请求总数;n9e_pushgw_proxy_remote_write_inflight(Gauge):当前在途请求数,是观察背压(backpressure)的关键指标;n9e_pushgw_proxy_remote_write_over_limit_total(Counter):因在途数超限被以 429 拒绝的请求数;n9e_pushgw_proxy_remote_write_body_too_large_total(Counter):因请求体超限被以 413 拒绝的请求数;n9e_pushgw_proxy_forward_total(Counter,标签url):向各 writer 转发次数;n9e_pushgw_proxy_forward_error_total(Counter,标签url、reason):转发失败次数,reason取值为build_request/do_request/status_4xx_5xx;n9e_pushgw_proxy_forward_duration_seconds(Histogram,标签url):单次转发延迟分布。
例如:当n9e_pushgw_proxy_remote_write_inflight长期贴近ProxyInflightMax上限时,应扩容或调高阈值;当rate(n9e_pushgw_proxy_forward_error_total[5m]) > 0持续告警时,需要按url和reason维度切片定位后端写入问题。
指标释义与内置文档支持
Nightingale 为大量内置指标提供了中英文释义,集中在 etc/metrics.yaml 中,按zh、en、ja等语言键组织,每条指标一行,格式为指标名: 释义。服务端在启动时通过 center/cconf/metric.go 的LoadMetricsYaml加载该文件,并由GetMetricDesc在查询指标释义接口(如GET /api/n9e/metrics/desc)时按语言回退链返回对应说明。这意味着你在 Nightingale 内置指标库里搜索n9e_或系统指标时,可以直接看到中文释义,降低理解成本。
配套仪表盘:导入即用
集成包内附带了三份与版本对应的仪表盘 JSON(见 integrations/N9E/dashboards/):
- n9e_server.json:面向 n9e server/pushgw 核心链路的仪表盘,从命名看适用于 V9 及以上版本,包含上文表格中的 6 个核心面板;
n9e_v6.json、n9e_v8.json:从命名看分别面向 V6、V8 版本的自监控面板。
三份 JSON 均采用 Nightingale 仪表盘的标准结构,configs.panels中的expr为 PromQL 查询表达式,var段定义了名为prom的 Prometheus 数据源变量。导入方式:在 Nightingale 的"仪表盘"页面选择导入 JSON,并把变量prom指向实际承载 n9e 指标数据的 Prometheus 数据源即可。
总结:监控系统自身的监控闭环
Nightingale 把"自我监控"作为一等公民设计——从 V5 到 V9 的所有服务进程都原生暴露 Prometheus 格式的/metrics,配合 Categraf 的 prometheus 插件即可零成本接入:
- 确认端点:
curl -fsS http://127.0.0.1:17000/metrics | head验证 n9e 的指标输出; - 编写采集配置:在
conf/input.prometheus/下新建n9e.toml,配置urls、instance标签与job标签; - 多实例全量覆盖:所有 n9e / n9e-edge 实例均纳入采集,保证
instance唯一; - 导入配套仪表盘:根据部署版本选择 n9e_server.json 或 V6/V8 版本仪表盘,直接观测数据接入、队列积压与告警链路健康度;
- 配置告警:针对
n9e_pushgw_sample_queue_size、n9e_alert_alert_queue_size等关键 Gauge 指标设置阈值告警,实现监控系统自身的故障预警。
这套方案让运维团队无需额外部署 exporter,即可实时掌握 Nightingale 集群的接收吞吐、写入延迟、队列积压与告警处理状态,是"用监控系统监控自己"的标准实践。
【免费下载链接】nightingaleNightingale is to monitoring and alerting what Grafana is to visualization.项目地址: https://gitcode.com/GitHub_Trending/ni/nightingale
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考