Skip to main content
RunBook Academy

Proxmox VEXVI · MonitoringMonitoring strategy

What to monitor across the Proxmox stack

Intermediate⏱ ~22 min

What you'll learn

  • Identify the metrics that matter at each layer and how much warning each one gives
  • Distinguish metrics, logs, events, and alerts
  • Explain why a running guest is not a healthy service, and where to measure instead
  • Assign every signal to page, ticket or dashboard rather than alerting on all of them

Prerequisites

None — start here.

Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12

Not yet marked complete on this device.

Why this matters in production

You cannot operate what you cannot see. Monitoring that misses real incidents is as bad as no monitoring; monitoring that floods the team with noise is ignored.

The four observability axes

AxisWhatWhen
MetricsNumeric measurements over timeFor trends and capacity
LogsDiscrete events with contextFor forensics
EventsState changesFor alerting
AlertsDerived from the aboveFor human attention

A node being up is not a guest being healthy

Between “the hypervisor is powered on” and “the user can do their work” there are five distinct states. Four of them can be perfectly true while the service is completely unavailable, and every one of them is what somebody somewhere is using as their availability measurement.

LevelWhat it provesWhat can still be broken
1. Node upThe hypervisor booted and is reachableEvery single thing above it
2. Guest runningA QEMU or LXC process existsGuest kernel panic, no network, filesystem read-only, application dead
3. Guest agent respondsThe guest kernel is alive and schedulingThe application, its dependencies, its data
4. Port is openSomething is listening on the socketThe application returning errors to every request
5. Endpoint returns the right answer, fast enoughWhat the user experiencesOnly genuinely user-specific problems

Each level is a necessary condition for the one below it and none is sufficient. A node with 400 days of uptime running a guest that has been serving HTTP 502 since lunchtime satisfies levels one through four.

Read-only / Safefind the guests where levels 2 and 3 disagree
set -euo pipefail

for vmid in $(qm list | awk '$3 == "running" {print $1}'); do
configured=$(qm config "$vmid" | awk -F'[ ,=]' '/^agent:/ {print $2}')
if [ "$configured" != "1" ]; then
  printf '%-6s L2 only  (no agent configured)\n' "$vmid"
elif qm guest cmd "$vmid" ping >/dev/null 2>&1; then
  printf '%-6s L3 ok\n' "$vmid"
else
  printf '%-6s L2 only  (agent configured, NOT answering)\n' "$vmid"
fi
done

What to monitor

Hosts

MetricWhy
CPU utilisation (host + per-VM)Capacity planning
Memory pressure (/proc/pressure/memory)OOM risk
Disk I/O (await, utilisation)Storage bottlenecks
Network errors and dropsHardware failures
SMART / NVMe healthDisk failures
TemperatureHardware failures
NTP offsetCluster consistency

Cluster

MetricWhy
Quorum stateCluster health
Corosync latencyNetwork health
pmxcfs sync statusConfiguration consistency
HA state per resourceHA health

Storage (ZFS)

MetricWhy
Pool capacityRunning out
Pool fragmentationPerformance
Scrub statusData integrity
Disk error countersHardware

Storage (Ceph)

MetricWhy
Cluster status (HEALTH_OK / WARN / CRIT)Health
OSD latency p95, p99Performance
PG states (active+clean vs degraded)Recovery
Pool utilisationCapacity
nearfull warningsPre-emptive

VMs and containers

MetricWhy
CPU steal timeHost contention
Balloon / memory pressureMemory overcommit
Disk I/O awaitStorage issues
Guest agent statusSnapshot consistency

Backups (PBS)

MetricWhy
Last backup age per VMRPO compliance
Last verify statusData integrity
Datastore capacityStorage
Sync job statusOff-site replication

Security

MetricWhy
Failed login attemptsBrute force
Configuration changesAudit
New API tokensAudit
Outbound connections to suspicious IPsExfiltration

Alert design

flowchart LR
  A[Metric source] --> B[Threshold check]
  B --> C[Above threshold?]
  C -->|yes| D[Alert]
  C -->|no| E[No action]
  D --> F[Notification]

Avoid alert storms by:

  • Grouping related alerts.
  • Using rate-of-change alerts instead of absolute thresholds.
  • Suppressing alerts when a known incident is in progress.

Sort every signal into page, ticket or dashboard

Deciding what to monitor is the easy half. The half that determines whether the on-call rota is survivable is deciding what each signal is allowed to do.

DestinationCriterionExamples
PageA human can act now, and waiting makes it materially worseTier-0 service unreachable; quorum lost; Ceph writes blocked; second OSD down in a failure domain; PBS datastore above 90%
Ticket with a deadlineDays of runway, but it will not fix itselfSingle OSD down and recovering; OSD nearfull; deep scrubs behind; certificate expiring in 30 days; a guest whose agent stopped answering
Dashboard onlyUseful for understanding, never for waking someoneCPU utilisation; network throughput; memory usage; guest counts

The exercise worth doing once, deliberately, is taking every alert you currently have and assigning it to one of those three. Most estates discover that a substantial share of their pages belong in the second column and a few belong in the third, and moving them is the single largest improvement available to on-call quality.

Production considerations

Common mistakes

  • Measuring at level 1 or 2 and calling it service availability.
  • Alerting on every metric, which produces fatigue and then ignored pages.
  • Alerting on utilisation rather than on pressure or saturation.
  • Absolute thresholds where a rate of change would give weeks of warning.
  • Running the monitoring inside the cluster it monitors.
  • Watching causes and not symptoms, so a real outage with normal-looking causes is invisible.
  • Never re-sorting existing alerts into page, ticket and dashboard.

Key takeaways

  • There are five levels between a node being up and a service working; four of them can be true while the user sees nothing.
  • Infrastructure monitoring fails optimistic, so at least one signal per service must come from a probe outside the cluster.
  • Monitor the stack: hosts, cluster, storage, guests, backups, security.
  • Assign every signal to page, ticket or dashboard, and re-do the exercise when the pager gets noisy.
  • Prefer leading indicators and rate of change; utilisation is a poor predictor and pressure is a good one.
  • If the cluster went dark, something outside it has to be what tells you.

Knowledge check

Knowledge check · 5 questions

  1. Q1. A guest shows running in qm list, its guest agent answers, and its HTTP port accepts connections. What does this establish about service availability?

  2. Q2. Which of these are good leading indicators - signals that give warning while remediation is still cheap? Select all that apply.

  3. Q3. Running the monitoring stack as guests on the cluster it monitors produces an availability figure that is conservative, because gaps in the data are counted against you.

  4. Q4. A team has forty alert rules and an on-call engineer who is paged three or four times a night. What is the most effective first step?

  5. Q5. Why is rate of change generally more actionable than an absolute threshold for capacity signals?

Passing score: 75%. Answers are checked in this browser.