OneUptime Proxmox 监控实战指南:从 Agent 部署到指标告警全解析
2026/9/20 10:49:16 网站建设 项目流程
  • 可观测性
  • 后端
  • 运维
  • 前端
  • 云原生
  • 微服务
  • AI Agent

【免费下载链接】oneuptime

Complete open-source monitoring and observability platform.

项目地址:https://gitcode.com/GitHub_Trending/on/oneuptime
点击查看免费下载

本文以 OneUptime 仓库中的 Proxmox Monitor 文档为主线,完整讲解如何监控 Proxmox VE 集群的节点、QEMU 虚拟机、LXC 容器、存储、HA 状态、备份任务覆盖与存储复制,并深入 agent 的 OpenTelemetry Collector 配置与pve_*指标体系。读完本文,你将掌握 Proxmox Monitor 的创建流程、指标查询与公式配置、内置告警模板的原理,以及部署 Proxmox Agent 和排查问题的完整实战方案。

概述:Proxmox 监控能做什么

OneUptime 的 Proxmox 监控能力让你可以透视整个 Proxmox VE 集群的虚拟化工作负载。监控数据由OneUptime Proxmox Agent(一个预配置的 OpenTelemetry Collector)负责采集,再根据你在 OneUptime 中配置的指标标准进行评估。它能带来以下几类核心能力:

  • 监控集群、节点以及每个 guest(虚拟机/容器)的健康状态
  • 跨节点与 guest 追踪 CPU、内存、磁盘和网络的用量
  • 及时发现离线节点与已停止的虚拟机/容器
  • 观察接近容量上限的存储卷
  • 对 HA 降级状态、未被任何备份任务覆盖的 guest、以及失败的存储复制发出告警

数据链路可以概括为:Proxmox VE APIprometheus-pve-exporter(把 API 翻译成pve_*Prometheus 指标)→Proxmox Agent(OTel Collector 抓取并打上集群身份标签)→OTLP上报 OneUptime。

创建 Proxmox Monitor

在 OneUptime Dashboard 中创建 Proxmox 监控的步骤如下:

  1. 进入Monitors(监控器)页面
  2. 点击Create Monitor(创建监控器)
  3. 监控类型选择Proxmox
  4. 选择要监控的 Proxmox 集群
  5. 配置指标查询与聚合方式
  6. 按需配置监控判定标准(criteria)

集群本身无需手动创建——集群会在 Proxmox Agent 第一次向其上报遥测数据时自动注册,注册的键是资源属性proxmox.cluster.name(见后文 agent 配置)。因此在创建监控之前,请先确保 Agent 已经部署并开始上报(详见本文「部署 Proxmox Agent」一节)。

配置选项详解

Proxmox 集群选择

在选择器中挑选要监控的集群即可。集群的自动注册机制由 Agent 的resource处理器实现——在 otel-collector-config.yaml 中,每个指标批次都会被写入proxmox.cluster.name属性:

resource: attributes: - key: proxmox.cluster.name value: "${env:PROXMOX_CLUSTER_NAME}" action: upsert

配置中特别强调:保持该值稳定,不要随意修改,否则会注册出一个全新的集群(与旧集群的数据割裂,也会影响按集群的保留期设置)。

指标查询(Metric Queries)

每个监控可以配置一个或多个指标查询,每个查询需要指定:

  • 指标名称(Metric name)——要查询的 Proxmox 指标,即pve_*系列
  • 聚合(Aggregation)——指标值的聚合方式:平均值、总和、最大值、最小值
  • 过滤器(Filters)——基于属性过滤:可以直接过滤原始id标签,也可以过滤派生的pve.scope/pve.type/pve.id属性(见下节)
  • Group By(分组)——可选地按id标签分组,使每个节点、guest、存储卷或复制任务被独立评估——每个受影响资源各产生一个事件

还可以创建公式(formulas),用数学表达式组合多个指标查询,例如用pve_memory_usage_bytes / pve_memory_size_bytes计算内存使用百分比。

id标签与派生属性

Agent 采集的每个指标都携带一个id数据点标签,用于标识该数据点所属的 Proxmox 资源。取值规则如下:

id资源
node/<name>集群节点,例如node/pve1
qemu/<vmid>QEMU 虚拟机,例如qemu/100
lxc/<vmid>LXC 容器,例如lxc/101
storage/<node>/<storage>某节点上的存储卷,例如storage/pve1/local

两个例外情况:复制系列指标(pve_replication_*)在id中携带的是复制任务的 id(例如100-0);而集群级别的pve_not_backed_up_total根本没有id标签

由于监控判定标准和属性过滤器都按相等(equality)而非前缀匹配,Agent 额外把id拆分成三个可用相等匹配过滤的数据点属性,内置告警模板正是依赖它们:

属性取值qemu/100示例
pve.scopenodegueststorageclusterqemulxc都映射为guestguest
pve.typenodeqemulxcstorageqemu
pve.idid中第一个/之后的部分(pve1100pve1/local100

这个拆分动作由 otel-collector-config.yaml 中的transform/pve-identity处理器完成,其核心逻辑是若干条set语句,例如:

- set(attributes["pve.scope"], "guest") where attributes["id"] != nil and IsMatch(attributes["id"], "^qemu/") - set(attributes["pve.type"], "qemu") where attributes["id"] != nil and IsMatch(attributes["id"], "^qemu/") - set(attributes["pve.id"], attributes["id"]) where attributes["id"] != nil and IsMatch(attributes["id"], "/") - replace_pattern(attributes["pve.id"], "^[^/]+/", "") where attributes["pve.id"] != nil

配置中的注释明确警告:不要移除这个处理器,内置的 Proxmox 告警模板都依赖这些属性做过滤。原始的id标签会被原样保留,供 Group By 页面和细分视图使用。

使用建议:

  • pve.scopepve.type过滤,把查询限定到某一类资源;
  • pve.id(或id)过滤,把查询限定到某一个具体资源;
  • id分组,则每个资源被独立评估。

滚动时间窗口

指标评估的时间窗口可选:

  • 过去 1 分钟
  • 过去 5 分钟
  • 过去 10 分钟
  • 过去 15 分钟
  • 过去 30 分钟
  • 过去 60 分钟

采集的指标全集

Proxmox Agent 每30 秒抓取一次 prometheus-pve-exporter,同时启用 cluster 与 node 两类采集器——这同时也覆盖了 exporter 默认开启的backup-info(集群级)与replication(节点级)采集器。抓取配置见 otel-collector-config.yaml:

scrape_configs: - job_name: oneuptime-proxmox metrics_path: /pve params: target: ["${env:PVE_HOST}"] cluster: ["1"] node: ["1"] scrape_interval: 30s static_configs: - targets: ["${env:PVE_EXPORTER_URL}"]

配置注释说明了 30 秒间隔的取舍:pve-exporter 每次抓取都会对 Proxmox VE API 做一次实时往返,30 秒可以把 pveproxy 上的负载控制在可忽略的水平。

可用性

指标说明
pve_up节点或 guest 在线/运行时为 1,否则为 0
pve_uptime_seconds节点或 guest 的运行时长(秒)
pve_version_info元数据系列,在 version/release 标签中携带 Proxmox VE 版本(值恒为 1)

节点

指标说明
pve_node_info节点元数据(值恒为 1)——对它求和即可统计集群中上报节点的数量
pve_cpu_usage_ratioCPU 使用率,为可用 CPU 的 0–1 比率
pve_cpu_usage_limit可用 CPU,单位为核(对 guest 而言即分配的 vCPU 数)
pve_memory_usage_bytes已用内存(字节)
pve_memory_size_bytes总内存(字节)

Guest(虚拟机 / LXC 容器)

指标说明
pve_guest_infoguest 元数据(name、node、type 为qemulxc)以标签形式存在,值恒为 1
pve_network_receive_bytesguest 累计接收字节数——要以速率形式绘制才能看到吞吐量
pve_network_transmit_bytesguest 累计发送字节数——同样建议以速率绘制
pve_disk_read_bytesguest 累计磁盘读取字节数——按速率绘制
pve_disk_write_bytesguest 累计磁盘写入字节数——按速率绘制
pve_onboot_statusguest 配置为开机自启时为 1——一个onboot=1却处于停止状态的 guest,通常意味着非预期的停机

CPU 与内存系列(pve_cpu_usage_ratiopve_memory_usage_bytes等)也会在每个 guest 上以qemu/*lxc/*的 id 发布。

存储

指标说明
pve_disk_usage_bytes磁盘/存储已用字节。对于 QEMU guest,除非安装了 QEMU guest agent,否则读数为 0
pve_disk_size_bytes磁盘/存储总大小(字节)
pve_storage_info存储元数据(值恒为 1)——求和即可统计存储卷数量

HA 高可用

指标说明
pve_ha_state高可用状态以枚举式系列呈现:每个可能状态(startedstoppederror等)各有一条系列,当前状态对应系列值为 1——按state标签过滤即可对特定状态告警

备份覆盖

来自 exporter 集群级的backup-info采集器(默认启用)。需要特别说明边界:这些指标只报告备份任务的覆盖情况——pve-exporter 并不暴露"备份最近是否运行或成功"的信息:

指标说明
pve_not_backed_up_total未被任何备份任务覆盖的 guest 数量。仅一条集群级系列,无id标签
pve_not_backed_up_info每个未覆盖的 guest 一条系列(值恒为 1),带 guest 的id标签。按id分组即可列出未覆盖的 guest——一旦 guest 加入某个备份任务,该系列就会消失

复制

来自 exporter 节点级的replication采集器(默认启用)。各系列在id标签中携带复制任务id(例如100-0):

指标说明
pve_replication_failed_syncs任务连续失败的同步尝试次数——只要大于 0,就说明副本正在变陈旧
pve_replication_duration_seconds任务上次同步耗时
pve_replication_last_sync_timestamp_seconds上次成功同步的 Unix 时间戳
pve_replication_last_try_timestamp_seconds上次同步尝试的 Unix 时间戳——比 last-sync 更新,说明最近一次尝试失败了
pve_replication_next_sync_timestamp_seconds下次计划同步的 Unix 时间戳
pve_replication_info任务元数据(值恒为 1),带 type、source、target、guest 标签

重要限制:判定引擎没有时钟运算(wall-clock math),因此无法直接对副本陈旧度当前时间 − 上次同步)告警——Proxmox 集群的 Overview 页面是在客户端计算这一数值的。替代方案是对pve_replication_failed_syncs告警(使用下文"Replication Failing"模板)。

监控判定标准(Monitoring Criteria)

评估对象

Proxmox 监控器始终评估 Metric Value——即所配置指标查询或公式的值。因此判定表单没有 Filter Type 选择器,只显示MetricAggregationConditionThreshold

聚合类型

聚合说明
Average时间窗口内的平均值
Sum所有值的总和
Maximum Value时间窗口内的最高值
Minimum Value时间窗口内的最低值
All Values所有值都必须满足条件
Any Value至少一个值满足条件

条件

静态阈值——与你输入的 Threshold 比较:

  • Greater ThanLess ThanGreater Than or Equal ToLess Than or Equal ToEqual To

基线异常检测——无需阈值,表单改为显示Sensitivity(灵敏度)和Baseline Window(基线窗口),将每个样本与基于该窗口构建的周内相同时段基线进行比较:

  • Anomalously High——值高于预期范围
  • Anomalously Low——值低于预期范围
  • Anomalous——值从任一方向偏离预期范围

异常条件会停留在Learning(学习)状态,直到积累了至少等于所设 Baseline Window 长度的指标历史,在此之前不会产生任何告警。

11 个内置告警模板

OneUptime 为常见 Proxmox 监控场景内置了11 个模板。每个模板都会构建一个完整的监控器——包括指标查询、属性过滤器、分组、触发条件(fire criteria)与自动恢复条件(auto-recover criteria),应用后仍可编辑。阈值只是起点。模板默认评估过去 5 分钟(除非表中另有说明),且条件必须在其窗口内的每一分钟都成立才会触发:

模板严重级别监控内容触发条件
Node Offline严重pve_up过滤到pve.scope=node,按id取最小值任一节点上报低于 1。每个节点一条事件;达到 ≥ 1 时恢复
Guest Down警告pve_uppve_onboot_status过滤到pve.scope=guest,按id取最小值配置为开机自启(pve_onboot_status= 1)的 guest 在整个窗口内pve_up低于 1。你故意停止的 guest 会被自动排除,永远不会触发
Cluster Quorum at Risk严重公式:pve_up÷pve_node_info× 100(两者都求和,pve.scope=node)= 在线节点百分比在线节点 ≤ 50%——这是诚实的 quorum 代理,因为 pve-exporter 不暴露任何 corosync 指标
High Node CPU Usage警告pve_cpu_usage_ratio过滤到pve.scope=node,按id取平均值> 0.9(节点 90% 的核被占用)
High Node Memory Usage警告公式:pve_memory_usage_bytes÷pve_memory_size_bytes× 100,pve.scope=node,按id> 节点 85% 的内存——真实的百分比,无需为每个节点调整字节级阈值
High Guest CPU Usage警告pve_cpu_usage_ratio过滤到pve.scope=guest,按id取平均值,过去 15 分钟15 分钟窗口内每一分钟都 > 0.95(95% 的已分配 vCPU)——guest 本应使用其分配的资源,因此只有从不降载的 guest 才会触发
Storage Near Full警告公式:pve_disk_usage_bytes÷pve_disk_size_bytes× 100,pve.scope=storage,按id> 卷容量的 85%
Container Root Disk Near Full警告同样的磁盘比率公式,过滤到pve.type=lxc,按id> 90%。QEMU 虚拟机被排除——没有 QEMU guest agent 时其 guest 内磁盘用量读数为 0
HA Resource in Error State严重pve_ha_state过滤到state=error,按id取最大值> 0——HA 无法恢复该资源;回落到 0 时恢复
Guest Not Backed Up警告pve_not_backed_up_total,取最大值(仅一条集群级系列,不做分组)> 0——至少一个 guest 不在任何备份任务中;回落到 0 时恢复。将pve_not_backed_up_infoid分组即可列出这些 guest。仅覆盖任务成员关系——不反映备份是否运行或成功
Replication Failing严重pve_replication_failed_syncs,按id取最大值(id 为复制任务 id)> 0——任务副本正在变陈旧;回落到 0 时恢复

模板背后的设计取舍

模板中蕴含了几条值得借鉴的监控设计原则:

  • 下线/离线类模板用 Min(最小值):单次下线抓取即可触发阈值,而不会被资源仍然在线时的抓取值掩盖。Guest Down额外要求同一id上有pve_onboot_status,因此故意停掉的 guest 永远不会打扰你
  • CPU 类模板用 Avg(平均值)pve_cpu_usage_ratio本身就是 0–1 的比率,每分钟的平均值即持续利用率。
  • 状态类模板(HA、备份、复制)用 Max(最大值):一次坏抓取即可触发。
  • 比率公式两侧都用 Sum 聚合:分子与分母来自同一次 exporter 抓取,抓取倍数相互抵消,结果才是真实百分比。
  • 模板均预先用pve.scope/pve.type过滤并id分组,因此每个受影响资源各自触发一条事件。

部署 Proxmox Agent

前置条件

  • 任意能访问你的 Proxmox VE API(端口 8006)的机器,装有 Docker Engine 20.10+ 与 Docker Compose v2 插件
  • 一个拥有PVEAuditor(只读)角色的 Proxmox VE API Token
  • 一个OneUptime Telemetry Ingestion Key(在Project Settings → Telemetry Ingestion Keys创建)

创建 Proxmox API Token(两条命令)

在任意 PVE 节点上以 root 身份执行:

pveum user token add monitoring@pam oneuptime --privsep 1 pveum acl modify / --roles PVEAuditor --tokens 'monitoring@pam!oneuptime'

(如果monitoring@pam用户还不存在,先执行pveum user add monitoring@pam——API Token 自带独立密钥,因此该用户无需密码或系统账户。)

关键要点:ACL 必须挂在根路径/,因为 PVEAuditor 需要读取 exporter 遍历的每个节点、guest 和存储对象的权限——若授予更窄的路径,集群其余部分会被隐藏并产生401/403 Permission check failed (/, Sys.Audit)错误。第一条命令只会打印一次 Token 密钥,之后在.env中对应为PVE_API_TOKEN_ID=monitoring@pam!oneuptimePVE_API_TOKEN_SECRET=<打印出的密钥>

也可以走 Proxmox Web UI(Datacenter → Permissions → API Tokens),记得在路径/上授予 PVEAuditor 角色,并取消 Privilege Separation。

部署位置建议

Agent 通过网络查询 PVE API,因此不必(也不建议)运行在集群节点上。最好放在能在节点故障时存活的机器上(独立硬件上的小监控 VM、管理主机),或者把PVE_HOST指向 VIP / round-robin DNS 而非单个节点地址——如果 Agent 的 API 目标正是刚宕掉的节点,你的监控也会跟着一起死。唯一的例外是可选的 journald 日志管线,它必须运行在 PVE 节点上。

Docker Compose 快速启动

从 agents/ProxmoxAgent 目录下载docker-compose.ymlotel-collector-config.yaml,在同目录创建.env

ONEUPTIME_URL=https://oneuptime.com ONEUPTIME_TELEMETRY_INGESTION_KEY=your-telemetry-ingestion-key PROXMOX_CLUSTER_NAME=my-proxmox-cluster PVE_HOST=192.168.1.10 PVE_API_TOKEN_ID=oneuptime@pve!exporter PVE_API_TOKEN_SECRET=your-token-secret COMPOSE_PROFILES=pve-exporter

启动(pve-exporterprofile 会同时启动内置的 exporter 容器):

docker compose up -d

集群会在一分钟左右自动出现在 OneUptime 的Proxmox区域。如果你已经在别处运行 pve-exporter,可以去掉COMPOSE_PROFILESPVE_API_TOKEN_IDPVE_API_TOKEN_SECRET,改用:

PVE_EXPORTER_URL=your-exporter-host:9221

环境变量一览

变量是否必需说明
ONEUPTIME_URLOneUptime 实例 URL
ONEUPTIME_TELEMETRY_INGESTION_KEY遥测接入密钥(Project Settings → Telemetry Ingestion Keys
PROXMOX_CLUSTER_NAMEOneUptime 中显示的集群标识,作为proxmox.cluster.name资源属性盖在每个指标上。保持稳定——修改它会注册新集群(默认proxmox-cluster
PVE_HOSTexporter 查询的 Proxmox VE API 主机(集群任一节点),例如192.168.1.10
PVE_EXPORTER_URLprometheus-pve-exporter 地址(host:port,无协议前缀)。默认内置 exporter(pve-exporter:9221
PVE_API_TOKEN_ID仅内置 exporter完整 Proxmox API Token id,例如oneuptime@pve!exporter
PVE_API_TOKEN_SECRET仅内置 exporterProxmox API Token 密钥
PVE_VERIFY_SSL是否校验 Proxmox API 的 TLS 证书(默认false——PVE 默认签发自签名证书)
COMPOSE_PROFILES设为pve-exporter以启动内置 exporter 容器

关于 Token 的拆分,docker-compose.yml 中有个实现细节:prometheus-pve-exporter 要求 Token 拆成用户部分(PVE_USER)与 Token 名部分(PVE_TOKEN_NAME),而.env中保存的是 UI 显示的完整 id(user@realm!tokenname),compose 文件通过 shell 参数展开把它拆开:

export PVE_USER="$${PVE_API_TOKEN_ID%%!*}" PVE_TOKEN_NAME="$${PVE_API_TOKEN_ID##*!}" && exec /usr/bin/pve_exporter

$$用于屏蔽 docker compose 的插值;exporter 会忽略其他未知的PVE_*变量。)

验证安装

docker compose ps # 检查 agent 状态 docker logs -f oneuptime-proxmox-agent # 查看采集器日志

日志中应看到"Everything is ready. Begin running and processing data.",一分钟后集群即可在 Dashboard 中出现。

可选的日志上报(Proxmox 服务日志)

默认 Agent 只上报指标,Proxmox dashboard 的 Logs 页签需要额外启用日志接收器。PVE 控制面把日志写到 systemd journal 下的 8 个单元:pveproxypvedaemonpve-firewallpve-ha-crmpve-ha-lrmpveschedulerpvestatdqmeventd。启用步骤(详见 agents/ProxmoxAgent/README.md):

  1. 在 PVE 节点上运行 Agent(journal 按主机隔离,远端 agent 读不到);
  2. 取消 otel-collector-config.yaml 中journald接收器与logs管线的注释;
  3. docker-compose.yml中挂载 journal 卷(/var/log/journal/etc/machine-id);
  4. 替换镜像:官方otel/opentelemetry-collector-contrib镜像基于 scratch 构建,没有journalctl二进制且以非 root 运行,需换成包含 systemd 的包装镜像,或在节点上直接运行otelcol-contrib.deb包。

不想换镜像也有备选:在节点上安装 rsyslog,用filelog接收器 tail/var/log/syslog(挂载整个/var/log目录而非单个文件,避免日志轮转钉住陈旧 inode),代价是失去按单元的过滤能力。

Proxmox VE 9+ 零安装替代方案

Proxmox VE 9.0+ 可以通过内置的 OpenTelemetry 指标服务器直接向 OneUptime 推送指标(Datacenter → Metric Server → Add → OpenTelemetry),无需 Agent 与 exporter:

  • Server:你的 OneUptime 主机
  • Port443Protocolhttps
  • Path/otlp/v1/metrics
  • Headers{"x-oneuptime-token": "your-telemetry-ingestion-key"}

两个需要注意的权衡:

  1. 集群发现:Agent 路径之所以能驱动集群自动注册,是因为它盖了proxmox.cluster.name资源属性。原生推送时需在 Resource Attributes 中设置proxmox.cluster.name=my-proxmox-cluster,否则指标会入库但不会出现 Proxmox 集群;
  2. 指标名不同:原生推送发出的是proxmox_node_*/proxmox_vm_*/proxmox_storage_*系列,而 Agent 路径是 pve-exporter 的pve_*系列。OneUptime 内置的 Proxmox 监控目录与告警模板针对的是pve_*命名——因此本文的模板与指标目录适用于 Agent 路径。

故障排查

集群没有出现在监控器的集群选择器中

集群靠 Agent 的遥测自动注册。请检查 Agent 是否在运行并在上报(见上面的验证安装),以及PROXMOX_CLUSTER_NAME是否已设置。docker logs oneuptime-proxmox-agent中的401表示接入密钥错误,connection refused 表示ONEUPTIME_URL不对。

缺少 guest 指标

guest 系列来自 exporter 的集群采集器cluster=1抓取参数,随附配置已启用)。如果你自定义过采集器配置,请恢复它。

"High Node CPU Usage" 不触发

模板对按id标签分组的pve_cpu_usage_ratio平均值,每个节点独立检查。如果你改用了自定义查询,务必id分组——不加分组地对所有节点取平均值会被空闲节点稀释,很难越过阈值。

缺少备份或复制指标

pve_not_backed_up_*来自 exporter 集群级backup-info采集器,pve_replication_*来自节点级replication采集器——两者默认启用,并受随附配置中cluster=1/node=1抓取参数覆盖。如果你自己运行 exporter,检查是否禁用了这些采集器。另外pve_replication_*系列只在集群配置了存储复制任务时才存在。

pve_network_receive_bytes等计数器只增不减

网络与磁盘 I/O 系列是累计计数器。应针对其变化速率告警(或对滚动窗口用公式计算速率),而不是直接对原始值告警。

深入阅读

  • 监控文档(本主题):packages/App/FeatureSet/Docs/Content/en/monitor/proxmox-monitor.md
  • Agent 安装与运维指南:agents/ProxmoxAgent/README.md
  • Agent 的 OTLP Collector 配置(含transform/pve-identity与抓取参数):agents/ProxmoxAgent/otel-collector-config.yaml
  • 内置 exporter 的 Compose 编排:agents/ProxmoxAgent/docker-compose.yml
  • 遥测接入文档(Token 创建与安装细节):packages/App/FeatureSet/Docs/Content/en/telemetry/proxmox.md
  • 可观测性
  • 后端
  • 运维
  • 前端
  • 云原生
  • 微服务
  • AI Agent

【免费下载链接】oneuptime

Complete open-source monitoring and observability platform.

项目地址:https://gitcode.com/GitHub_Trending/on/oneuptime
点击查看免费下载

相关推荐

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

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

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

立即咨询