Glances 数据导出到 CouchDB:配置、JSON 文档结构与源码实现解析
【免费下载链接】glancesGlances 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
导读
本文介绍 Glances 的 CouchDB 导出模块(--export couchdb):如何通过配置文件[couchdb]段建立与 CouchDB 服务器的连接、以原生 JSON 文档形式存储各插件统计信息,并结合仓库源码讲解type/time字段注入、数据库自动创建、字段扁平化等底层实现细节。读完本文,你将能够独立完成 Glances → CouchDB 的监控数据落库配置,并理解每一条文档字段的来源。
1. 概述:Glances 的 CouchDB 导出能力
CouchDB 是 Glances 官方支持的多种后端导出目标之一(其余还包括 InfluxDB、Graphite、Elasticsearch、Prometheus、Kafka 等,参见 docs/gw/index.rst)。它的定位很明确:把 Glances 各插件采集到的实时统计(CPU、内存、负载、网络……)周期性地写入 CouchDB 数据库,便于后续通过 CouchDB 的 REST API 或 Fauxton Web 界面做历史查询与可视化。
从源码结构看,CouchDB 导出功能由一个独立模块承载:glances/exports/glances_couchdb/init.py,它继承自所有导出模块共用的基类GlancesExport(glances/exports/export.py)。基类负责统计数据的收集、字段扁平化与公共配置读取,而 CouchDB 模块只关心"如何连上服务器、如何写文档"这两件事。
依赖说明:该模块使用
pycouchdb客户端库与 CouchDB 交互,这是该导出功能生效的前提条件,需要在安装 Glances 时一并提供。
2. 配置文件:[couchdb]段详解
2.1 标准配置示例
连接信息定义在 Glances 配置文件的[couchdb]段中(文档示例):
[couchdb] host=localhost port=5984 db=glances user=root password=example仓库自带的完整示例配置位于 conf/glances.conf:
[couchdb] # Configuration for the --export couchdb option # https://www.couchdb.org host=localhost port=5984 db=glances user=admin password=admin2.2 参数语义与源码解读
各参数的含义与在源码中的用法如下:
| 参数 | 默认值(示例配置) | 含义 | 是否必填 |
|---|---|---|---|
host | localhost | CouchDB 服务器主机名或 IP | 必填 |
port | 5984 | CouchDB HTTP 端口(官方默认 5984) | 必填 |
db | glances | 目标数据库名称,不存在时会自动创建 | 必填 |
user | admin | 认证用户名 | 必填 |
password | admin | 认证密码 | 必填 |
源码依据:在 glances/exports/glances_couchdb/init.py 中,load_conf('couchdb', mandatories=['host', 'port', 'db', 'user', 'password'])将这五个参数全部列为强制性配置项——只要缺任意一个,load_conf返回失败,模块随即以退出码2终止进程(sys.exit(2))。
特别值得注意的一点:源码注释明确指出 "User and Password are mandatory with CouchDB 3.0 and higher"——即CouchDB 3.0 及以上版本强制要求认证,因此即使你使用本地开发服务器,也必须显式配置user与password。这也是示例配置中保留这两个字段、而不是像某些旧版导出器那样可省略的原因。
其余参数缺失时会怎样?基类GlancesExport.load_conf(glances/exports/export.py)对非必填参数采用"有则读取、无则跳过并记录 DEBUG 日志"的宽容策略,而[couchdb]段恰好没有可选参数,五个字段全部走 mandatory 分支——任一缺失都会在日志中输出Error in the couchdb configuration (...)并导致导出功能不可用。
2.3 配置文件位置提示
上述[couchdb]段需要放置在你实际使用的配置文件中。Glances 的配置目录结构可参考 docs/config.rst:配置文件的全局说明与各模块分节规则均在此文档中描述。仓库中 conf/glances.conf 是完整参考配置,conf/empty.conf 是空模板,均可用作起点。
3. 启动导出:命令行操作
配置完成后,以如下命令启动 Glances 并启用 CouchDB 导出(命令参数详见 docs/cmds.rst):
$ glances --export couchdb--export参数支持逗号分隔的模块列表,因此可以同时向多个后端导出,例如:
$ glances --export couchdb,influxdb指定自定义配置文件时:
$ glances -C ./conf/glances.conf --export couchdb模块源码头部自带一份可复现的本地联调指南(glances/exports/glances_couchdb/init.py),适合用来快速验证整个链路:
# 1) 用 Docker 启动一个带认证的 CouchDB 实例 $ docker run -d -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=admin \ -p 5984:5984 --name my-couchdb couchdb # 2) 以安静模式运行 Glances 并导出到 CouchDB $ .venv/bin/python -m glances -C ./conf/glances.conf --export couchdb --quiet # 3) 在浏览器打开 CouchDB 管理界面查看结果 $ http://127.0.0.1:5984/_utils4. 连接与写入流程:源码级调用链
4.1 连接初始化
模块初始化时,源码通过如下流程建立连接(glances/exports/glances_couchdb/init.py):
- 拼接 URI:
http://{user}:{password}@{host}:{port}/(基础认证凭据直接内嵌在 URI 中;源码以# @TODO: https标注了尚未支持的 HTTPS 场景); - 创建
pycouchdb.Server客户端;连接失败时记录 CRITICAL 日志并以退出码2终止; - 检查目标数据库是否存在:不存在则调用
s.create(self.db)自动创建数据库,存在则复用——这一行为解释了为什么db参数不必预先在 CouchDB 中手工建好; - 返回数据库句柄
s.database(self.db)供后续写入使用。
4.2 数据写入与字段注入
写入动作由export(name, columns, points)方法完成(glances/exports/glances_couchdb/init.py):
- 基类传来的
columns(字段名列表)与points(值列表)先被zip成字典data; - 注入两个元数据字段:
data['type'] = name——插件名(如load、cpu、mem);data['time'] = datetime.now().isoformat()[:-3] + 'Z'——UTC 时间戳,格式为2026-09-19T02:25:25.524Z(毫秒精度、Z后缀表示 UTC,与文档中的"2016-09-24T16:39:08.524Z"示例完全一致);
- 调用
self.client.save(data)将整个字典作为一条CouchDB JSON 文档写入。
上游数据从何而来?GlancesExport.update()(glances/exports/export.py)是通用导出编排入口:它调用stats.getAllExportsAsDict()与stats.getAllLimitsAsDict()获取所有可导出插件的统计值和阈值(limits),将二者合并后交给build_export()做字段扁平化,最后逐个插件回调export()。这也是为什么 CouchDB 文档里会同时出现统计值(min1、min5、cpucore)和阈值字段(load_careful、load_warning、load_critical)的原因。
4.3 插件过滤规则
并非所有插件都会导出。基类定义了一份不可导出插件黑名单(glances/exports/export.py):
non_exportable_plugins = [ "alert", "help", "plugin", "psutilversion", "quicklook", "version", ]这些属于内部辅助型插件(帮助页、版本信息、告警等),不产生有意义的时序数据,因此在plugins_to_export()中被过滤掉。可导出插件列表会作为_last_exported_list缓存,供init_fields等场景复用。
5. 文档格式:原生 JSON 与字段示例
CouchDB 本身以 JSON 文档为存储单位,Glances 无需做任何序列化转换,直接把扁平化后的统计字典存成文档。每篇文档的字段构成如下:
- Glances 注入字段:
type(插件名)、time(ISO-8601 UTC 时间戳); - 插件统计字段:由
build_export()递归扁平化产生——嵌套字典会按父字段.子字段的方式展开为扁平键名(glances/exports/export.py); - CouchDB 系统字段:
_id(文档唯一 ID)与_rev(修订号),由 CouchDB 服务端自动生成。
文档官方示例——load 插件的统计文档(摘自 docs/gw/couchdb.rst):
{ "_id": "36cbbad81453c53ef08804cb2612d5b6", "_rev": "1-382400899bec5615cabb99aa34df49fb", "min15": 0.33, "time": "2016-09-24T16:39:08.524Z", "min5": 0.4, "cpucore": 4, "load_warning": 1, "min1": 0.5, "history_size": 28800, "load_critical": 5, "type": "load", "load_careful": 0.7 }字段解读:
| 字段 | 来源 | 含义 |
|---|---|---|
type | Glances 注入 | 插件名,本例为load,可用于按插件类型过滤/分区查询 |
time | Glances 注入 | 采集时刻(UTC,毫秒精度),用于时序查询 |
min1/min5/min15 | load 插件统计 | 1/5/15 分钟平均负载 |
cpucore | load 插件统计 | 逻辑 CPU 核数(负载归一化参考值) |
history_size | load 插件统计 | 历史数据保留点数(此处 28800 与 Glances 默认的历史窗口相关) |
load_careful/load_warning/load_critical | 阈值合并 | 负载分级告警阈值,由update()中的 limits 合并逻辑带入文档 |
_id/_rev | CouchDB 服务端 | 文档唯一标识与修订号,属于数据库系统字段 |
注意:文档中type与 CouchDB 的_id/_rev是两套完全不同的机制——type是业务语义上的插件标识,_id/_rev是存储层标识,不要混淆。
6. 查看与验证结果
CouchDB 自带 Web 管理界面(Fauxton),可直接在浏览器中查看落库结果,URL 格式如下:
http://127.0.0.1:5984/_utils/database.html?glances其中glances即配置中的db数据库名。如果数据库被自动创建、且文档随时间持续增长,说明导出链路工作正常。也可以使用 CouchDB 的 REST API 直接验证,例如列出数据库中的文档:
$ curl -u admin:admin "http://127.0.0.1:5984/glances/_all_docs?limit=5"7. 常见问题与注意事项
- CouchDB 3.0+ 认证必填:
user与password是强制性配置项(源码mandatories列表),缺一不可;3.0 之前版本虽然支持无认证,但示例配置一律要求填写。 - 数据库无需预先创建:目标库不存在时,模块会自动调用
s.create(self.db)创建(glances/exports/glances_couchdb/init.py)。 - HTTPS 暂不支持:源码以
# @TODO: https注释标明当前仅支持http://连接,生产环境如使用 TLS 终结的反向代理可自行处理。 - 连接失败即退出:服务器不可达或认证失败时,模块记录 CRITICAL 日志并以退出码
2终止,便于在脚本/容器编排中及时发现。 - 写入失败仅告警不退出:单条文档写入失败只记录 ERROR 日志(
Cannot export {name} stats to CouchDB),不会中断 Glances 主循环。 - 导出内容范围:仅
plugins_to_export()返回的插件参与导出,alert、help、quicklook、version等内部插件被排除(glances/exports/export.py)。
8. 总结
Glances 的 CouchDB 导出是一条"配置即用"的成熟链路:在[couchdb]段填好 5 个必填参数、以--export couchdb启动,Glances 就会周期性地把每个可导出插件的统计值连同阈值一起,以原生 JSON 文档(含type插件标识与timeUTC 时间戳)写入指定数据库。其核心实现集中在 glances/exports/glances_couchdb/init.py(连接、建库、写入)与 glances/exports/export.py(数据收集、字段扁平化、插件过滤)两个文件中,理解这两处代码,即可完全掌握该导出器的行为边界与可扩展点。
【免费下载链接】glancesGlances 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),仅供参考