简介:VMware vCenter监控数据导出工具是一套面向Prometheus监控体系的信息采集器,专为数据中心管理员与虚拟化运维工程师设计,可实时获取虚拟机快照数量、快照创建时间戳、存储空间容量及主机关键性能数据,配合Prometheus完成指标可视化与告警,便于排查虚拟机变更历史并预防存储瓶颈。压缩包内共19个文件,大小约50KB,以Python源码为核心(4个py文件),包含vmware_exporter主程序与线程管理模块,同时提供systemd服务单元、Dockerfile、json/yml/yaml配置模板以及txt、docx、README等文档,支持以系统服务或容器方式快速部署到现有监控环境。目前已有206人学习下载,目录结构清晰,适合具备一定虚拟化和监控基础的中高级运维人员。通过这份资源,读者可以拿到完整的vmware_exporter实现,理解其抓取逻辑和指标导出格式,并借助附带的告警规则与仪表盘配置,快速搭建虚拟机快照数量和容量趋势的可视化看板,从而提升虚拟化环境的可观测性与运维效率。
1. 从快照堆积到 Prometheus 可量化:这个 vCenter 采集器到底解决什么
某虚拟化团队深夜被存储报警刷屏,登进 vCenter 一看,几十台虚拟机各自堆了十几个快照,最夸张的一份占了 300 多 GB,创建时间已经是两个月前。这种场景靠控制台一个个点开虚拟机查看属性能把人累垮,而标题里这个「VMware_vCenter监控数据导出工具」,本质就是为 Prometheus 监控系统设计的 vCenter 信息采集器:把虚拟机快照数量、快照创建时间戳、存储空间容量、主机性能这类 vCenter 管理面数据,转成 Prometheus 能拉取的指标。它的价值不在“采集”本身,而在把「快照泛滥」这种慢性风险变成一个持续更新的数值,该报警时报警。适合手里已有 Prometheus、又被 vCenter 复杂管理面逼疯的运维工程师。
2. 它到底采什么:vCenter 信息采集器的指标设计与采集原理
2.1 两层架构:对 vCenter 的采集循环与对 Prometheus 的指标暴露
先说清楚这类采集器的整体结构。它不是一个侵入 vCenter 的插件,而是独立部署的进程:通过 vCenter 的 SDK 接口周期性登录、查询虚拟机和主机的清单与运行时信息,在内存里转成指标格式,再通过一个 HTTP 端点暴露给 Prometheus 定期抓取。Prometheus 是 pull 模型,所以采集器自己不需要维护推送通道,只管“被动等待抓取”,这对故障排查和生命周期管理都更友好:进程挂了,Prometheus 的 up 指标立刻能发现。
常见实现里,主循环一般长这样:启动时建立 vCenter 会话,进入定时循环,每次循环做「登录校验 → 拉虚拟机清单 → 批量查快照与存储 → 查主机性能计数器 → 更新指标快照」,然后等待下一次间隔。因为 vCenter 的 API 有会话数量和 QPS 限制,循环内通常会用并发查询,但会控制并发上限,避免把 vCenter 管理面本身打满。
# 伪代码,说明采集循环的骨架逻辑 while True: if not session.is_valid(): session.reconnect() # 会话过期后自动重连,避免静默失败 vms = session.get_vm_list() # 拿到虚拟机清单,后续查询按批处理 snapshot_metrics = query_snapshots(vms) # 快照数量 + 创建时间 storage_metrics = query_datastores(vms) # 存储容量与剩余空间 host_metrics = query_host_perf(vms) # 主机 CPU / 内存 / 磁盘延迟 update_prometheus_registry(snapshot_metrics + storage_metrics + host_metrics) time.sleep(interval)这段逻辑里有几个值得注意的参数点:session.reconnect 决定了会话失效后能不能自愈,很多采集器用一段时间就拉不到数据,就死在会话过期后没有重连逻辑;interval 是采集间隔,后面会单独讲为什么不能照抄 15 秒这种 Prometheus 默认抓取频率;query_snapshots 和 query_datastores 是否分批,直接决定上千台虚拟机规模下会不会把请求超时打爆。
2.2 为什么快照数量和时间戳值得单独成指标
虚拟机的快照数量是一个典型的 Gauge 指标,它的变化特征是“只增不减”的累积项——快照只有在用户手动删除时才减少,而日常运维中经常被遗忘。单独把快照数量导出来,配合 Prometheus 的告警规则做阈值报警,比靠人眼巡检可靠得多。快照创建时间戳的价值在于推导“快照年龄”:用time() - snapshot_create_time_seconds就能得到每个快照存在了多久,超过 7 天、30 天就报警,这是存储风险最直接的预警信号。
这两个指标一定要区分计量语义。快照数量是瞬时量,任何时候拉取到的都是当前值,不能对它做 rate 之类的 Counter 运算;时间戳是事件发生时刻,导出为 Unix 时间戳秒级数值,用途是和当前时间做差值。很多新手会把时间戳当成普通数值告警,直接设置> 1700000000这种写死的阈值,一旦跨月就失效。正确做法是动态计算年龄,在告警规则里用time() - 指标表达式。
2.3 指标范围:虚拟机、数据存储与主机三层对象
采集器按 vCenter 的对象模型,输出通常分为三个层级。虚拟机层最核心,包含快照数量、快照创建时间戳、电源状态、CPU/内存配置量、虚拟磁盘大小;数据存储层包含总容量、剩余容量、已用空间,这部分直接回答“存储还够撑多久”;主机层则是 ESXi 主机的 CPU 使用率、内存使用率、磁盘读延迟、网络吞吐这类动态性能计数器,来自 vCenter 性能管理器的实时采样。
我一般会在配置里把指标范围做白名单控制,默认只开启上述几类核心指标,而不是把所有 vCenter 能查的字段全部导出。原因很简单:vCenter 的清单对象里天然带着大量关联属性,比如虚拟机所属的资源池路径、文件夹路径、自定义属性,以及主机的厂商型号、序列号等。全量导出的结果是 Prometheus 标签基数爆炸,几个维度交叉下来时序数量翻好几倍,采集器本身压力不大,Prometheus 的存储和查询先扛不住。底线是只保留告警和排障用得到的标签。
3. 把采集器跑起来:最小部署配置与三个必调参数
3.1 用 docker compose 跑通最小采集实例
这类采集器最常见的部署形态是容器,因为本身无状态、只有配置和端口,正好适合容器化。一个最小的 docker compose 配置长这样:
services: vcenter-exporter: image: your-registry/vcenter-exporter:latest container_name: vcenter-exporter restart: unless-stopped ports: - "9273:9273" environment: VCENTER_HOST: "${VCENTER_HOST}" VCENTER_USERNAME: "${VCENTER_USERNAME}" VCENTER_PASSWORD: "${VCENTER_PASSWORD}" SCRAPE_INTERVAL: "120" REQUEST_TIMEOUT: "30" METRICS_FILTER: "snapshot,storage,host"逻辑说明:VCENTER_HOST 填写 vCenter 的 FQDN 或 IP,注意必须是管理面地址而不是 ESXi 的地址;VCENTER_USERNAME 和 VCENTER_PASSWORD 通过环境变量从宿主机注入,避免写死在 compose 文件里,密码里如果带$、\这类特殊字符,记得用.env文件配合env_file管理;SCRAPE_INTERVAL 是采集器内部向 vCenter 查询的间隔;METRICS_FILTER 是刚才说的指标白名单,只保留快照、存储、主机性能三类。
参数说明:端口 9273 是这类 exporter 的常见约定,不是强制的,但建议固定一个端口不要随意换,方便 Prometheus 配置和后续维护;restart: unless-stopped 保证宿主机重启后自动拉起,不然监控采集器本身反而成了单点。
3.2 vCenter 连接配置与权限模型:别拿管理员账号喂采集器
连接 vCenter 的账号建议专门创建一个只读监控账号,在 vCenter 权限体系里分配“只读”角色即可。这个账号不需要对虚拟机有任何写权限,因为采集器全程只做查询。用管理员账号跑采集器的风险是:一旦采集进程被攻破或被配置文件泄露,攻击者拿到的是一张 vCenter 全域管理门票,同时管理员账号的密码轮换频率往往更低,长期写在环境变量里的风险更大。
有个容易忽略的权限点:只读角色虽然能查询虚拟机和存储,但如果采集器需要读取主机性能计数器,部分实现需要额外授予“性能统计”的查看权限。某次我排查发现采集器一切正常但主机 CPU/内存指标全为空,最后发现是账号缺少性能查看权限。建议在部署后用一个有权限差异的环境先验证指标确实有值,再批量推广。
3.3 三个必调参数:采集间隔、请求超时和指标过滤
采集间隔是第一个要改的参数。Prometheus 的默认抓取间隔是 15 秒,但 vCenter 的 API 不是为秒级轮询设计的,快照数量、存储容量这类指标变化频率极低,15 秒采集纯属给 vCenter 管理面增加无意义的负担。我一般把采集间隔设在 120 到 300 秒之间,Prometheus 的 scrape_interval 与采集器内部间隔保持同步或略小于它,避免 Prometheus 连续多次拉到同一份快照。
请求超时是第二个。vCenter 在管理上千台虚拟机时,批量查询接口响应可能达到秒级甚至十几秒,如果采集器内部请求超时设成默认的 5 秒,会频繁拿到空结果。推荐把对 vCenter 的请求超时设到 30 秒以上,同时把 Prometheus 的 scrape_timeout 也同步调大到 60 秒左右,否则会出现采集器还在等 vCenter 响应、Prometheus 已经因为超过抓取时限而标记目标失败的情况。
指标过滤是第三个。默认导出所有标签时,虚拟机的资源池路径、文件夹路径、数据中心名称这些维度都会变成标签,如果还要加自定义字段,组合数量会翻很多倍。推荐的底线是只保留虚拟机名、数据中心、集群、数据存储名这几个基本标签。过滤配置写在采集器的配置文件里,比在 Prometheus 端用 relabel 丢弃更省带宽和内存——数据在源头就只生成必要的时序,而不是生成后再丢弃。
4. 快照数量、时间戳与存储容量:核心指标怎么用才不出错
4.1 快照数量指标:树结构统计口径决定准不准
vCenter 里的快照不是平铺列表,而是树状结构:一个虚拟机可以有多个快照分支,父快照下还能挂子快照。统计快照数量时,如果只遍历顶层根快照列表,返回的数量会小于实际快照数——子快照全被漏掉了。我见过最典型的错误口径:虚拟机有 3 个根快照,每个根快照下面还有 2 个子快照,实际快照数是 9,采集器只报 3,告警阈值设 5 永远不触发。
正确做法是对每个虚拟机展开整棵快照树,统计所有节点数,并在指标上额外暴露一个字段区分“根快照数量”和“总快照数量”。有些实现还会带快照链深度,可以在一个虚拟机快照嵌套异常深时单独告警。下表的指标映射是通用命名风格,不同实现可能略有出入,但语义是一致的:
| vCenter 对象 | 指标名(参考) | 类型 | 说明 |
|---|---|---|---|
| 虚拟机 | vmware_vm_snapshot_count | Gauge | 该虚拟机的总快照节点数 |
| 虚拟机 | vmware_vm_snapshot_create_time_seconds | Gauge | 各快照的创建时间 Unix 时间戳 |
| 数据存储 | vmware_datastore_capacity_bytes | Gauge | 数据存储总容量,字节 |
| 数据存储 | vmware_datastore_free_bytes | Gauge | 数据存储剩余容量,字节 |
| 主机 | vmware_host_cpu_usage_percent | Gauge | 主机 CPU 使用率百分比 |
4.2 快照创建时间戳:单位、时区与 age 推导
快照创建时间戳导出时最容易出两个问题:一是用毫秒而不是秒,导致time() - 指标的时间跨年被放大 1000 倍,告警立刻误报;二是直接用 vCenter 返回的本地时间字符串而不是 UTC 归一。对比之下,统一在采集端就转成 Unix 时间戳(秒级)最省心,这样下游 PromQL 里直接用time()减即可,不受任何时区配置影响。
# 推荐的 PromQL 用法:计算每个快照存在了多少秒 time() - vmware_vm_snapshot_create_time_seconds{snapshot_name!=""}逻辑说明:snapshot_name 这个标签用于区分同虚拟机下的不同快照,没有它时同一虚拟机的多个快照时间戳会聚合在一起,max/min 出来的值没有意义。参数上建议把“按虚拟机按快照名分组”写成 recording rule,既能反复使用,也不让每次告警都现算。
4.3 存储容量与主机性能指标的进率换算
存储容量这类指标有个隐蔽的坑:不同 vCenter 版本的接口返回单位不一致,有的返回字节,有的返回 KB,还有的返回 MB。如果不在采集端统一换算,到 Prometheus 里的数字会差出几个数量级。常见做法是在采集端统一输出为字节,展示层再除以 1024 的三次方得到 GB。用 GB 单位直接展示虽然直观,但字节单位做算术更精确,也方便跨数据存储比较。
主机性能指标要看 vCenter 的采样类型。CPU 使用率和内存使用率通常已经是百分比或绝对值,可以直接导出;磁盘延迟这类计数器有的返回毫秒,有的返回微秒,必须确认单位后再输出。另外主机性能是周期性覆盖采样的,vCenter 默认的采样间隔可能是 20 秒、5 分钟甚至更长,采集器查到的数据实际反映的是上一个采样周期的平均值,不是实时值。做告警时注意不要对这类指标设置过短的持续时间窗口,常见做法是连续 15 分钟以上超阈值再告警,过滤掉采样周期导致的瞬时抖动。
5. 踩坑记录:会话超时、快照树与时间戳时区的 4 个教训
5.1 抓取超时导致目标频繁 Down:串行查询是原罪
现象:Prometheus 的 target 页面里,采集器目标每隔几次抓取就出现一次context deadline exceeded,up 指标间歇性为 0。
原因:虚拟机数量超过几百台后,采集器内部仍是串行查询——先查所有虚拟机属性,再逐个查每台虚拟机的快照列表,单轮采集耗时超过 60 秒,Prometheus 抓取自然超时。
解决:把查询改为并发批量,按 50 台虚拟机一组分批拉快照信息,同时把 Prometheus 的 scrape_timeout 调到 60 秒。另一个习惯是把采集器自身暴露的scrape_duration_seconds指标加进监控面板,只要它接近 scrape_timeout 就要警惕规模增长后的性能瓶颈。
5.2 vCenter 会话被回收后采集器静默失败:日志一片安静
现象:采集器进程还活着,端口有响应,Prometheus 拉取也正常返回,但所有 vmware_vm 前缀的指标只剩几台,大量虚拟机凭空消失。
原因:vCenter 的会话 Token 默认有有效期(常见配置在 30 分钟到数小时不等),会话过期后采集器的查询静默返回空结果,而进程没有退出也没有打印错误日志。这类问题最阴险,因为采集器自身监听的 HTTP 端口一切正常,只有指标内容悄悄变了。
解决:在采集器里加上会话有效性检查,每次循环先确认会话可用,不可用则重新认证;同时加上一个诊断指标,比如vcenter_session_valid 0/1。部署后我习惯每个月随机抽查一次采集器输出,用 PromQL 查一下虚拟机数量历史曲线,如果出现持续性下跌就要查会话问题了。
5.3 快照数量只统计到父快照:子分支全被漏掉
现象:某虚拟机的 vCenter 界面明明显示 9 个快照,采集器报出的数量只有 3。
原因:vCenter 的快照列表返回的是根快照数组,每个根快照下面还有 childSnapshotList 子快照数组,采集器只遍历了第一层,没有递归展开子树。
解决:必须递归遍历整棵快照树,统计每个节点的数量,并且每个节点都要单独导出创建时间戳。需要提醒的是:有些 vCenter 版本返回的快照数据里,内存快照和磁盘快照是分开记录的,统计时要把两类都算进去,否则数量仍然偏小。做验证时不要只看界面总数,直接调用一次 vCenter 的查询接口统计树节点数和采集器输出比对。
5.4 快照年龄告警提前 8 小时触发:UTC 时区挖的坑
现象:告警规则设置快照年龄超过 7 天报警,结果每天下午 4 点开始报错,到了上午又自动恢复,误差正好 8 小时。
原因:vCenter 返回的创建时间本地化在东八区,采集器直接当成 UTC 时间戳输出,导致真实时间比当前时间早了 8 小时。用time() - 指标计算出来的 age 全部偏大 28800 秒。
解决:采集端统一把时间转换成 UTC 的 Unix 秒级时间戳,不在采集器里保留任何本地时区字符串;同时验证方式是用 SQL 直接查 vCenter 的数据库确认某一个快照的实际创建时间,和采集器输出的数字互相换算比对一遍。这个坑的教训是:任何时间字段都必须确认时区和单位后再接告警,不要想当然。
6. 验证与进阶:把快照风险挡在存储爆满之前
用 10 分钟做一轮快速验证。先确认采集器进程在 Prometheus 配置的 targets 里处于 UP 状态,然后直接访问采集器的 metrics 端点,用 grep 过滤快照相关指标,确认确实有数据返回:
curl -s http://127.0.0.1:9273/metrics | grep vmware_vm_snapshot如果返回里有vmware_vm_snapshot_count且数值和 vCenter 界面手动查询的快照数一致,说明快照统计口径正确;如果没有输出,多半是账号权限或指标过滤配置把这类指标挡掉了。时间戳的验证同样直接:挑一台已知快照创建时间的虚拟机,用 date 命令把输出的秒数换算成日期,和 vCenter 界面对比是否一致。
进阶用法是把年龄计算做成 recording rule,再配一个持续时间告警,避免瞬时抖动误报:
groups: - name: vcenter-snapshot-age rules: - record: vmware:snapshot_age_seconds expr: time() - vmware_vm_snapshot_create_time_seconds - alert: VmSnapshotTooOld expr: max(vmware:snapshot_age_seconds) by (vm) > 604800 for: 1h annotations: summary: "虚拟机 {{ $labels.vm }} 存在超过 7 天的快照"这套规则能在快照开始堆积时就提前告警,而不是等存储容量告警爆了再去找谁占的空间。最后提醒一句:任何采集器都不是免维护的黑匣子。我过去吃过一次亏,某个采集器静默失效了三天,全靠虚惊一场的存储告警才发现,从那以后,我每次做完新指标的部署都顺手加一个vcenter_session_valid的即时可用性检查,并且把采集器自身的scrape_duration_seconds和历史曲线一起挂到面板上。养成这个习惯,快照监控这条路才算真正走通。希望帮到你。
本文还有配套的精品资源,点击获取