- 指标监控
- 监控大盘
- CLI
- 告警
- MCP 服务
【免费下载链接】glances
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.
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_cb、disconnected_cb、reconnected_cb三个回调分别记录错误、断线与重连事件,并维护_connected状态标志; - 若连接失败,
_async_init会抛出异常,由基类GlancesExportAsyncio捕获并记入日志,同时后台线程继续运行以备重试,不会导致 Glances 主程序直接崩溃。
每次采集周期,导出框架(glances/exports/export.py 中的update()/build_export())会把各插件统计值整理成columns与points两个列表,随后调用 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.network、glances.diskio、glances.processlist等主题。
消息体是 JSON 格式的键值对,键为字段名(小写),值为对应的统计值。这一结构由_async_export中的subject_data = dict(zip(columns, points))与json_dumps(subject_data)生成,每个主题对应 Glances 的一个插件模块,便于消费者按需订阅特定维度。
第四步:用 Python 客户端订阅消费
官方文档给出了一个基于nats-py(natsPython 客户端库)的最小订阅示例,完整代码如下:
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.cpu、glances.mem等所有一级主题,适合需要全量采集或持久化存储的场景(例如转发到时序数据库)。注意通配符*只匹配一级,若要匹配更深层级的主题可结合 NATS 的多级通配符(如>)使用,集成测试 tests/test_export_nats.sh 中就用到了glances.>来统计全部消息。
端到端验证:用 Docker 快速跑通 NATS 导出
仓库中的 tests/test_export_nats.sh 提供了一个完整、可复现的端到端验证脚本,其流程对自建环境极具参考价值:
- 启动 NATS 服务器:用
docker run -d --name nats-for-glances -p 4222:4222 -p 8222:8222 -p 6222:6222 nats:latest启动官方 NATS 容器(4222 为客户端端口,8222 为监控端口,6222 为集群路由端口),并等待约 5 秒就绪; - 启动订阅者:使用
natsio/nats-box容器中的nats sub glances.>命令在后台订阅全部 Glances 主题并统计收到的消息数; - 运行 Glances:执行
python -m glances --config ./conf/glances.conf --export nats --stop-after 10 --quiet,采集 10 轮后退出; - 校验结果:等待约 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.
相关推荐
Argo CD Notifications 集成 NATS:配置参数、认证与消息订阅实战指南
Argo CD Notifications 集成 NATS:配置参数、认证与消息订阅实战指南 Argo CD 的 Notifications 系统持续监控 Ap
云原生CI/CD容器编排DevOps后端Glances 数据导出到 RabbitMQ:AMQP 消息队列集成配置与实现原理指南
Glances 数据导出到 RabbitMQ:AMQP 消息队列集成配置与实现原理指南 Glances 是一个跨平台(GNU/Linux、BSD、macOS、W
指标监控监控大盘CLI告警MCP 服务Telegraf NATS Consumer 输入插件详解:从 NATS 与 JetStream 订阅消费指标数据
Telegraf NATS Consumer 输入插件详解:从 NATS 与 JetStream 订阅消费指标数据 NATS Consumer 是 Telegr
可观测性指标监控运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考