Glances 接入 NATS 消息代理:配置导出、数据模型与订阅消费实战指南
2026/9/20 0:43:21 网站建设 项目流程
  • 指标监控
  • 监控大盘
  • CLI
  • 告警
  • MCP 服务

【免费下载链接】glances

Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.

项目地址:https://gitcode.com/gh_mirrors/gl/glances
点击查看免费下载

NATS 是一个轻量级、高性能的开源消息代理(message broker),Glances 原生支持将系统监控统计数据实时发布到 NATS 服务器,供下游消费者(微服务、数据管道、自建监控面板)异步订阅。本文以 Glances 官方文档 docs/gw/nats.rst 为主体,结合仓库内导出模块源码、默认配置与集成测试,完整讲解从配置、启动、数据模型到 Python 客户端订阅消费的全过程。

NATS 导出功能概述

Glances 内置的 NATS 导出模块位于 glances/exports/glances_nats/init.py,它属于 Glances 导出框架(glances/exports/)中的异步(AsyncIO)实现之一。其工作方式可以概括为:Glances 周期性采集各插件的统计数据,将每个插件的数据以 JSON 消息的形式发布到 NATS 服务器上以<prefix>.<plugin>命名的 subject(主题)中,任何 NATS 客户端都可以通过订阅这些主题实时获取监控数据。

从源码看,Export类继承自GlancesExportAsyncio(定义于 glances/exports/export_asyncio.py),后者在后台线程中维护一个持久的事件循环,负责 NATS 连接的初始化、数据发布与优雅退出,从而让 Glances 主程序在同步采集的同时完成异步的网络 I/O。

第一步:在配置文件中定义 NATS 连接

使用 NATS 导出前,需要先在 Glances 配置文件中定义[nats]段。默认配置文件 conf/glances.conf 中已经给出了完整示例(位于#L993-L999):

[nats] # Configuration for the --export nats option # https://nats.io/ # Host is a separated list of NATS nodes host=nats://localhost:4222 # Prefix for the subjects (default is 'glances') prefix=glances

配置项说明

  • host(必填):NATS 服务器的连接地址,采用nats://host:port格式,默认端口为 4222。根据 glances/exports/glances_nats/init.py 中load_conf的调用方式,host是唯一强制项(mandatories=['host']),缺失时会直接以exit('Missing NATS config')终止程序。
  • prefix(可选):发布主题的前缀,默认值为glances。源码中通过self.prefix = self.prefix or 'glances'保证未配置时回退到默认值。若配置了多个 NATS 节点,请按需保持 prefix 的一致性,以便消费者使用统一的主题前缀订阅。

此外,配置文件注释明确说明 host 可以是一个逗号分隔的 NATS 节点列表("Host is a separated list of NATS nodes"),对应源码中servers=[s.strip() for s in self.hosts.split(',')]的处理逻辑——这对搭建 NATS 集群(leaf node 或 cluster)的高可用场景很有用,客户端会按列表尝试连接。

第二步:启动 Glances 并导出到 NATS

配置完成后,在命令行中启用 NATS 导出:

$ glances --export nats

此时 Glances 会读取配置文件中的[nats]段并建立连接,同时正常显示 TUI 界面。如需在无界面环境下运行(如服务器后台导出),可以组合其他命令行参数,例如集成测试 tests/test_export_nats.sh 中使用的:

$ python -m glances --config ./conf/glances.conf --export nats --stop-after 10 --quiet

其中--config指定配置文件路径,--stop-after 10表示采集 10 轮后自动退出(便于自动化验证),--quiet关闭 TUI 输出。你也可以用--export nats --export ...同时启用多个导出后端。

连接与重连机制(源码视角)

NATS 连接的建立发生在_async_init()中,源码展示了几个值得关注的细节:

  • 连接参数:reconnect_time_wait=2(重连间隔 2 秒)、max_reconnect_attempts=60(最多尝试 60 次);
  • 通过error_cbdisconnected_cbreconnected_cb三个回调分别记录错误、断线与重连事件,并维护_connected状态标志;
  • 若连接失败,_async_init会抛出异常,由基类GlancesExportAsyncio捕获并记入日志,同时后台线程继续运行以备重试,不会导致 Glances 主程序直接崩溃。

每次采集周期,导出框架(glances/exports/export.py 中的update()/build_export())会把各插件统计值整理成columnspoints两个列表,随后调用 NATS 模块的_async_export(name, columns, points)dict(zip(columns, points))序列化为 JSON 后发布到主题,并调用flush(timeout=2.0)确保消息落盘。发布计数由_publish_count维护,退出时(_async_exit)会先drain()close(),保证已发布消息完整送达。

第三步:理解 NATS 数据模型与主题命名

Glances 的 NATS 导出遵循简单一致的数据模型:所有统计数据以 JSON 消息发布到如下主题:

<prefix>.<plugin>

例如,当prefix=glances时:

  • CPU 统计发布到主题glances.cpu
  • 内存统计发布到glances.mem
  • 网络统计、磁盘 I/O、进程列表等各插件分别对应glances.networkglances.diskioglances.processlist等主题。

消息体是 JSON 格式的键值对,键为字段名(小写),值为对应的统计值。这一结构由_async_export中的subject_data = dict(zip(columns, points))json_dumps(subject_data)生成,每个主题对应 Glances 的一个插件模块,便于消费者按需订阅特定维度。

第四步:用 Python 客户端订阅消费

官方文档给出了一个基于nats-pynatsPython 客户端库)的最小订阅示例,完整代码如下:

import asyncio import nats async def main(): nc = nats.NATS() await nc.connect(servers=["nats://localhost:4222"]) future = asyncio.Future() async def cb(msg): nonlocal future future.set_result(msg) await nc.subscribe("glances.cpu", cb=cb) # Wait for message to come in print("Waiting (max 30 seconds) for a message on 'glances' subject...") msg = await asyncio.wait_for(future, 30) print(msg.subject, msg.data) if __name__ == '__main__': asyncio.run(main())

运行该脚本后,它会连接本地 NATS 服务器(nats://localhost:4222)、订阅glances.cpu主题并等待最多 30 秒,收到第一条 CPU 统计数据后打印主题名与消息数据。代码中await nc.subscribe("glances.cpu", cb=cb)即文档所述的单主题订阅方式。

使用通配符订阅全部统计

NATS 原生支持通配符订阅。要一次性接收 Glances 导出的所有插件数据,把订阅主题换成通配符即可:

await nc.subscribe("glances.*", cb=cb)

glances.*会匹配glances.cpuglances.mem等所有一级主题,适合需要全量采集或持久化存储的场景(例如转发到时序数据库)。注意通配符*只匹配一级,若要匹配更深层级的主题可结合 NATS 的多级通配符(如>)使用,集成测试 tests/test_export_nats.sh 中就用到了glances.>来统计全部消息。

端到端验证:用 Docker 快速跑通 NATS 导出

仓库中的 tests/test_export_nats.sh 提供了一个完整、可复现的端到端验证脚本,其流程对自建环境极具参考价值:

  1. 启动 NATS 服务器:用docker run -d --name nats-for-glances -p 4222:4222 -p 8222:8222 -p 6222:6222 nats:latest启动官方 NATS 容器(4222 为客户端端口,8222 为监控端口,6222 为集群路由端口),并等待约 5 秒就绪;
  2. 启动订阅者:使用natsio/nats-box容器中的nats sub glances.>命令在后台订阅全部 Glances 主题并统计收到的消息数;
  3. 运行 Glances:执行python -m glances --config ./conf/glances.conf --export nats --stop-after 10 --quiet,采集 10 轮后退出;
  4. 校验结果:等待约 2 秒让尾部消息到达,若收到的消息数不少于 10 条(MIN_MESSAGES=10)则判定成功,否则脚本以非零状态退出。

该测试同时验证了--stop-after--quiet与 NATS 导出的组合用法,是排查"配置正确但收不到消息"问题时的极佳参考。依赖方面,NATS 导出模块需要nats-py客户端库,版本约定见 all-requirements.txt(nats-py==2.15.0)。

常见问题排查

  • 启动时报 "Missing NATS config":说明配置文件中缺少[nats]段或未设置必填的host项,请对照上文配置示例补全。
  • glances --export nats无法连接服务器:确认 NATS 服务已启动且host地址、端口正确;若使用集群,检查 host 逗号分隔列表是否完整。连接失败不会阻塞 Glances 主流程,可通过日志(默认 DEBUG 级别下会输出NATS Connecting to servers: ...NATS Successfully connected to servers: ...)确认连接状态。
  • 订阅不到消息:核对 prefix 是否一致——发布端[nats]段中的prefix与消费者订阅的主题前缀必须匹配;同时确认订阅主题命名符合<prefix>.<plugin>模型,例如默认配置下 CPU 数据位于glances.cpu而非cpu

小结

通过[nats]配置段 +--export nats命令行参数,Glances 即可将全量系统统计以 JSON 消息实时发布到 NATS 主题,形成<prefix>.<plugin>的清晰数据模型。配合nats-py客户端与通配符订阅,可以低成本地将 Glances 的监控数据接入消息驱动的数据管道,实现异步、解耦、可扩展的监控数据分发。相关源码、配置与测试均可在当前仓库中查阅:导出模块、官方文档、默认配置、集成测试。

  • 指标监控
  • 监控大盘
  • CLI
  • 告警
  • MCP 服务

【免费下载链接】glances

Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.

项目地址:https://gitcode.com/gh_mirrors/gl/glances
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询