Proxmox VEXVI · MonitoringMetrics and notifications
Metrics and notifications: two subsystems, one confusion
What you'll learn
- Distinguish the metric path from the notification path and name the configuration file for each
- Decide between native push export and pull-based scraping for a given estate
- Recognise the questions each subsystem can and cannot answer
- Avoid the common configurations that produce a dashboard with no alerting behind it
Prerequisites
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
Why this matters in production
Proxmox has two entirely separate mechanisms for telling you about itself, and a great many clusters have configured one and believe they have both.
| Metrics | Notifications | |
|---|---|---|
| Answers | How much? For how long? Is it trending? | Something happened, and you should know |
| Mechanism | pvestatd pushes samples to an external server | Events are matched and delivered to a target |
| Configuration | /etc/pve/status.cfg | /etc/pve/notifications.cfg (secrets in priv/) |
| Data shape | Time series, continuous | Discrete events, with a type and a severity |
| Fails by | Going quiet | Discarding silently |
| Covers | Node, guest and storage statistics | Backups, replication, fencing, updates, mail to root |
The overlap between those two columns is zero. A backup failure never appears in a metric. Memory usage never generates a notification. Configuring an InfluxDB export and building a Grafana dashboard gives you a beautiful view of resource consumption and no knowledge whatsoever that last night’s backup failed.
Both subsystems are covered in depth later in this part. This lesson is the map: which one you are looking at, what it is for, and the decisions that belong at this level.
The metric path
pvestatd on every node collects statistics and pushes them to the
servers defined in /etc/pve/status.cfg. There is no endpoint to scrape and
nothing to install on the node.
PVE 9 supports three backends:
| Backend | Transport | Notes |
|---|---|---|
| Graphite | UDP (default) or TCP, port 2003 | Metric path prefix defaults to proxmox |
| InfluxDB | UDP, HTTP or HTTPS via influxdbproto | v2 API needs an organisation, bucket and token |
| OpenTelemetry | OTLP/HTTP | New in PVE 9; JSON encoding only |
set -euo pipefail
# Metric servers. status.cfg is replicated, so this is cluster-wide.
pvesh get /cluster/metrics/server --output-format yaml
# Notification targets and matchers. Separate subsystem, separate file.
pvesh get /cluster/notifications/matchers --output-format yaml
# Is pvestatd complaining? For an HTTP export this is where a failure appears,
# and it appears per node, so check each one.
journalctl -u pvestatd --since '1 hour ago' --no-pager \
| grep -Ei 'metric|influx|graphite|otel' || echo 'no metric errors logged'Push export against pull-based scraping
Both are in production use and the choice is architectural.
| Native push | pve-exporter and Prometheus | |
|---|---|---|
| Who initiates | Each node, outbound | Prometheus, inbound to the management network |
| To install | Nothing | An exporter service, with a PVE API token |
| Failure visibility | Poor on UDP, acceptable on HTTP | Excellent — a failed scrape is data |
| Data source | pvestatd, the same figures the GUI plots | The PVE API |
| Query language | Whatever the backend offers | PromQL |
The deciding argument is usually up is a metric. Prometheus records a
failed scrape, so “we stopped receiving from pve-03” is an alertable
condition. With push, absence of data is absence of data, and building an
alert on it requires deliberate work on the receiving side.
The notification path
Since PVE 8.1 the notification system is a first-class subsystem with two object types:
- A target is a destination:
sendmail,smtp,gotifyorwebhook. - A matcher decides which notifications reach which targets, using rules on metadata fields, severity and calendar.
The property that produces most of the trouble: a notification that matches no matcher is discarded. Silently. Delivery is opt-in.
The events a PVE cluster emits are a short and finite list:
| Event | type | Severity | Metadata |
|---|---|---|---|
| Backup succeeded | vzdump | info | hostname, job-id |
| Backup failed | vzdump | error | hostname, job-id |
| Storage replication failed | replication | error | hostname, job-id |
| Cluster node fenced | fencing | error | hostname |
| System updates available | package-updates | info | hostname |
| Mail addressed to root | system-mail | unknown | hostname |
Anything not in that list — a full datastore, a degraded ZFS pool, an OSD that has been down for a week — reaches you only if something else generates mail to root, or if an external monitoring system is watching.
set -euo pipefail
# 1. The target. mode is insecure, starttls or tls; default tls.
pvesh create /cluster/notifications/endpoints/smtp \
--name relay-ops \
--server smtp.example.com \
--port 587 \
--mode starttls \
--username 'pve-notify@example.com' \
--password 'REPLACE_ME' \
--from-address 'pve-notify@example.com' \
--mailto 'ops@example.com'
# 2. The matcher. Field rules take the form exact:<field>=<value> or
# regex:<field>=<pattern>; mode all requires every rule to match.
pvesh create /cluster/notifications/matchers \
--name backup-failures \
--mode all \
--match-field 'exact:type=vzdump' \
--match-severity error \
--target relay-ops
# 3. Confirm both exist.
pvesh get /cluster/notifications/endpoints/smtp --output-format yaml
pvesh get /cluster/notifications/matchers --output-format yamlPBS has its own, configured separately
Proxmox Backup Server implements the same target and matcher model with its own configuration, reached in the PBS interface under Configuration → Notifications. Its metric server is configured separately again, under Configuration → Metric Server.
Two things follow, and both are easy to get wrong:
- A matcher on the PVE cluster does not route PBS notifications. The two systems share a design and share no configuration. “Notifications are configured” has to be answered twice.
- The PBS metric export carries host and datastore statistics only. It does not carry job outcomes, so a PBS dashboard cannot tell you whether a verification job found a corrupt chunk. That comes from the notification side.
Choosing what to build
| Estate | Reasonable configuration |
|---|---|
| Home lab, one node | Built-in graphs, plus a sendmail or gotify target with a broad matcher |
| Small production, one cluster | Built-in graphs, notification targets with per-type matchers, and a backup-freshness check |
| Multiple clusters or a capacity story to defend | Add an external metric server, external probes for service availability, and alerting on the receiving side |
| Regulated or contractual availability | All of the above, plus availability measurement from outside the cluster and a heartbeat proving the alert path works |
The order matters. Notifications before metrics, every time. A cluster that pages a human when a backup fails and has no dashboards is in much better shape than one with beautiful dashboards and an unrouted notification system, and it takes an afternoon rather than a project.
Common mistakes
- Building dashboards and calling it monitoring. Metrics answer how much, never something happened.
- Configuring a target with no matcher. It tests successfully and delivers nothing.
- A
match-severity errorsafety net, which excludesunknownand therefore excludes SMART, mdadm and cron failures. - Assuming PVE notifies about storage or Ceph health. It does not.
pip installinto the system Python on a PVE 9 node.- Configuring PVE notifications and forgetting PBS, where the events that matter most are generated.
- Leaving a metric export on UDP and having no way to tell whether it works.
- Restoring
/etc/pvewithoutpriv/and leaving every target unable to authenticate.
Key takeaways
- Two subsystems, two configuration files, no overlap:
status.cfgfor metrics,notifications.cfgfor events. pvestatdpushes; nothing scrapes PVE natively. Prometheus needspve-exporter, and it should not run on a PVE node.- Notifications are opt-in through matchers, and an unmatched notification is discarded silently.
- The PVE event list is short — backups, replication, fencing, updates, mail to root. Everything else is your monitoring system’s job.
- PBS is configured separately for both, and its metric export carries no job outcomes.
- Configure notifications first.
Knowledge check
Knowledge check · 5 questions
Q1. A cluster exports metrics to InfluxDB and has a Grafana dashboard covering every node and guest. A nightly backup job has been failing for one guest for six weeks and nobody noticed. Why did the dashboard not show it?
Q2. Which of these does the PVE notification system generate an event for on its own? Select all that apply.
Q3. Configuring notifications on the PVE cluster also covers Proxmox Backup Server, since PBS uses the same notification configuration.
Q4. What is the correct way to run prometheus-pve-exporter against a PVE 9 cluster?
Q5. Which should be configured first on a new production cluster, and why?
Passing score: 75%. Answers are checked in this browser.