- 指标监控
- 监控大盘
- CLI
- 告警
- MCP 服务
【免费下载链接】glances
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.
本篇技术指南聚焦 Glances 的 StatsD 导出模块(docs/gw/statsd.rst),讲解如何将主机 CPU、内存、负载等实时监控指标以 gauge 形式推送到 StatsD 服务器(如 Graphite 生态的前端聚合层),涵盖配置文件写法、命令行启用方式、指标命名规则与底层实现原理。读完本文,你将能够独立完成 Glances → StatsD → Graphite 的监控数据链路搭建,并理解导出过程中字段过滤、名称规范化等关键行为。
StatsD 导出在 Glances 中的定位
Glances 是一款面向 GNU/Linux、BSD、macOS 与 Windows 的系统监控工具,除了终端 TUI 与 Web 界面之外,还内置了 20 余个"导出(export)"模块,用于把采集到的统计数据推送至外部时序系统。StatsD 是其中面向 Graphite 生态的标准入口:StatsD 本身是一个 UDP/TCP 聚合守护进程,接收形如metric:value|type的指标报文,聚合后写入 Graphite 等后端存储与绘图平台。
在 Glances 中启用 StatsD 导出,意味着每个刷新周期内采集到的插件数据(cpu、mem、load、network 等)都会被打包为带前缀的指标名,通过statsdPython 客户端以 gauge 类型发送给 StatsD 服务器。官方文档对其定位的描述是"You can export statistics to a StatsD server (welcome to Graphite!)"——即作为接入 Graphite 监控体系的直通管道。
配置[statsd]段:三个关键参数
StatsD 的连接信息需要在 Glances 配置文件中声明。仓库自带的示例配置位于 conf/glances.conf 第 853-858 行,其[statsd]段如下:
[statsd] # Configuration for the --export statsd option # https://github.com/etsy/statsd host=localhost port=8125 #prefix=glances文档 docs/gw/statsd.rst 给出的最小可用配置为:
[statsd] host=localhost port=8125 prefix=glances各参数含义:
| 参数 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
host | 必填 | 无 | StatsD 服务器主机名或 IP 地址,如localhost或10.0.0.8 |
port | 必填 | 无 | StatsD 服务器端口,业界默认8125 |
prefix | 可选 | glances | 所有指标名的统一前缀,便于在 Graphite 中按主机/来源归类 |
从源码看,必填与可选参数的划分由 glances/exports/glances_statsd/init.py 中的load_conf调用严格限定:
self.export_enable = self.load_conf('statsd', mandatories=['host', 'port'], options=['prefix'])其中load_conf是导出基类 glances/exports/export.py 提供的通用配置加载方法:mandatories中的参数一旦缺失,配置加载失败并返回False;options中的参数缺失时仅记录 debug 日志、不会报错。因此host与port是硬性要求,缺一不可;而prefix可以省略。
若配置加载失败(例如[statsd]段缺失或缺少必填项),模块会直接抛出错误信息并退出:
if not self.export_enable: exit('Missing STATSD config')注意:host缺失时(例如只写[statsd]空段)会返回False触发该退出逻辑;若整个段不存在,日志中会记录No statsd configuration found。
启用导出:命令行--export statsd
配置就绪后,用--export参数启动 Glances 即可:
$ glances --export statsd启动时日志会打印连接目标(源码 glances/exports/glances_statsd/init.py):
Stats will be exported to StatsD server: localhost:8125--export是一个逗号分隔的多选参数,定义于 glances/main.py:
parser.add_argument('--export', dest='export', help='enable export module (comma-separated list)')主程序在 glances/main.py 中将其拆分为逐模块开关:
if args.export is not None: for p in args.export.split(','): setattr(args, 'export_' + p, True)因此多个导出器可以同时启用,例如:
$ glances --export statsd,influxdbStatsD 导出还支持 Glances 的客户端模式:在服务器端采集、客户端侧导出的架构下,同样可以把远端主机指标转发给 StatsD,参见 glances/main.py 中的用法示意:
$ glances -c <ip_server> --export statsd关于刷新与导出节奏:StatsD 导出基于 Glances 的常规刷新周期(默认 3 秒,可用-t调整)。每个周期内,导出引擎调用update()收集所有可导出插件的统计项,再逐插件触发export()。需要说明的是,StatsD 的 gauge 指标记录的是采样时刻的瞬时值,Glances 不会在本地维护历史,历史曲线由 Graphite 侧按采样时间线绘制。
指标命名与输出格式
启用后,Glances 会生成形如下列的指标(文档 docs/gw/statsd.rst 中的示例):
'glances.cpu.user': 12.5, 'glances.cpu.total': 14.9, 'glances.load.cpucore': 4, 'glances.load.min1': 0.19, ...命名结构为prefix.plugin.field:
prefix:默认glances,可自定义,用于在 Graphite 中区分数据来源;plugin:插件名(小写),如cpu、load、mem、network;field:该插件导出的字段名(小写),如user、total、min1、cpucore。
指标名生成逻辑位于导出模块的export()方法(glances/exports/glances_statsd/init.py):
def export(self, name, columns, points): """Export the stats to the Statsd server.""" for i in range(len(columns)): if not isinstance(points[i], Number): continue stat_name = f'{name}.{columns[i]}' stat_value = points[i] try: self.client.gauge(normalize(stat_name), stat_value) except Exception as e: logger.error(f"Can not export stats to Statsd ({e})") logger.debug(f"Export {name} stats to Statsd")关键行为:
- 仅导出数值型字段:
isinstance(points[i], Number)过滤掉字符串、布尔值等非数值数据,保证发送给 StatsD 的都是可绘图的 gauge 值; - 统一使用 gauge 类型:每次采样都覆盖更新同名指标,这与 StatsD 的 counter/timer 语义不同,适合描述"当前状态"的系统监控数据;
- 导出失败不中断主流程:单次发送异常仅记录 error 日志,Glances 本体继续运行。
另外需要留意导出字段列表的构造方式。columns与points由导出基类的build_export()方法(glances/exports/export.py)递归生成:字典结构递归展开为key.field形式的扁平字段名,嵌套结构会被拼接,列表结构(如多块磁盘、多网卡)则逐项展开。export()中f'{name}.{columns[i]}'把插件名与展开后的字段名拼接,得到最终的glances.cpu.user式指标名。
指标名规范化:normalize 的细节
StatsD/Graphite 对指标名有字符限制,冒号、百分号、空格等特殊字符可能导致链路解析异常。为此导出模块在发送前调用normalize()(glances/exports/glances_statsd/init.py):
def normalize(name): """Normalize name for the Statsd convention""" # Name should not contain some specials chars (issue #1068) ret = name.replace(':', '') ret = ret.replace('%', '') return ret.replace(' ', '_')规则共三步:
- 删除冒号
:(对应 issue #1068 中报告的指标名兼容问题); - 删除百分号
%(例如某些传感器字段名中的%); - 将空格替换为下划线
_。
该函数作用于stat_name整体(即包含glances.前缀的完整名称),因此自定义前缀、插件名与字段名都会经过统一清洗。从调用链看,normalize发生在client.gauge()之前,属于发送前的最后一道格式保障。
客户端初始化与依赖
连接客户端在init()中创建(glances/exports/glances_statsd/init.py):
def init(self): """Init the connection to the Statsd server.""" if not self.export_enable: return None logger.info(f"Stats will be exported to StatsD server: {self.host}:{self.port}") return StatsClient(self.host, int(self.port), prefix=self.prefix)其中:
port被显式转换为int,配置文件中即使写成字符串也会被正确解析;prefix作为StatsClient构造参数传入,由statsd库负责拼接,与export()中手工拼接plugin.field组合成完整指标名;- 模块依赖第三方库
statsd(from statsd import StatsClient),使用前需确保该库已安装(Glances 的导出模块按需启用,未安装对应依赖时该导出器不可用)。
如果未显式配置prefix,模块会兜底设置为默认值(glances/exports/glances_statsd/init.py):
# Default prefix for stats is 'glances' if self.prefix is None: self.prefix = 'glances'这也解释了文档注释"prefix is optional (glances by default)"的行为来源。
导出引擎的整体框架
StatsD 导出器继承自统一基类GlancesExport(glances/exports/export.py),该基类定义了所有导出模块的公共契约:
load_conf():按段加载配置(含必填/可选参数策略);build_export():把插件统计递归扁平化为(names, values)列表;update():每个刷新周期被调用,遍历所有可导出插件并触发export();plugins_to_export():返回可导出插件清单,内部排除了alert、help、plugin、psutilversion、quicklook、version等非指标类插件(glances/exports/export.py)。
导出器在启动阶段由 glances/stats.py 的load_exports()扫描exports目录动态加载:statsd参数被置为True时,glances_statsd模块被实例化并纳入更新循环。每个采样周期,导出引擎调用update()收集统计,经build_export()扁平化后交给本模块的export()发送,形成完整的"采集 → 扁平化 → 清洗 → 发送"流水线。
常见问题与排查思路
| 现象 | 排查方向 |
|---|---|
启动即退出并提示Missing STATSD config | 检查配置文件是否存在[statsd]段,且host、port均已填写;确认glances --export statsd与配置文件中段名一致 |
| 指标未出现在 Graphite | 确认 StatsD 服务监听8125(或自定义端口)且 UDP 可达;确认 Graphite 已配置 StatsD 作为前端聚合器 |
| 指标名中出现异常字符或无法解析 | 观察日志中Can not export stats to Statsd报错;升级后normalize()已清洗冒号、百分号与空格 |
| 只想导出部分字段 | 可在[export]公共段使用exclude_fields(正则列表,见 conf/glances.conf)过滤不需要的字段,该过滤作用于所有导出模块 |
小结
Glances 的 StatsD 导出链路简单而直接:配置[statsd]段(host、port必填,prefix可选默认glances),以--export statsd启动,每个刷新周期将各插件的数值型字段以prefix.plugin.field命名的 gauge 指标推送到 StatsD,最终汇入 Graphite 生态。通过阅读 glances/exports/glances_statsd/init.py 的源码,可以确认其数值类型过滤、名称规范化(normalize)与失败容错等行为,为生产环境下的监控排障提供了明确依据。
- 指标监控
- 监控大盘
- CLI
- 告警
- MCP 服务
【免费下载链接】glances
Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.
相关推荐
一站式Windows系统优化解决方案:Chris Titus Tech WinUtil完全指南
一站式Windows系统优化解决方案:Chris Titus Tech WinUtil完全指南 Chris Titus Tech WinUtil是一款高效智能的
桌面应用运维cAdvisor 指标导出 statsd 实战:参数配置、指标清单与源码实现解析
cAdvisor 指标导出 statsd 实战:参数配置、指标清单与源码实现解析 cAdvisor 支持将容器资源指标推送到 statsd https://li
可观测性指标监控云原生TDengine StatsD 指标写入实战:通过 taosAdapter 把 StatsD 监控数据落库
TDengine StatsD 指标写入实战:通过 taosAdapter 把 StatsD 监控数据落库 StatsD 是应用生态中广泛使用的轻量级指标收集协
数据库时序数据库大数据物联网云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考