Veeam Backup & Replication¶
Monitors Veeam Backup & Replication v13 via the REST API. Collects job status, repository capacity, license usage, proxy health, protected objects, and infrastructure server availability.
License: Pro
Prerequisites¶
- Veeam Backup & Replication v13 or later
- A Veeam account with Backup Administrator role (Backup Viewer is not sufficient for the REST API)
- Network access from the agent to the Veeam server on port 9419 (REST API)
Configuration¶
# probes.d/30-veeam.yaml — each file under probes.d/ is a YAML array of probes
- name: veeam-prod
type: veeam
params:
endpoint: "https://veeam-server"
port: 9419
username: 'DOMAIN\svc_monitoring'
password: ${secret:veeam-prod.password} # OS secret store; inline plaintext is auto-sealed on install
interval: 300
verify_ssl: false
hours_to_check: 24
Parameters¶
| Parameter | Must set | Default | Description |
|---|---|---|---|
endpoint |
Yes | - | Backup server hostname or URL; port is appended when the address carries none. Example: https://veeam.example.com |
port |
No | 9419 |
REST API port, used when endpoint carries none |
username |
Yes | - | Veeam account with the Backup Administrator role |
password |
Yes | - | Password of the Veeam account. A secret: reference it with ${secret:…}, ${env:…} or ${file:…} rather than writing it in the file |
verify_ssl |
No | true |
Validate the server's TLS certificate; false for a self-signed certificate |
interval |
No | 300 |
Seconds between collections |
hours_to_check |
No | 24 |
Job history window in hours; a job with no run inside it counts as stale |
The three integer parameters must be written as plain numbers (300, not "300" or 300s); any other form is ignored and the default applies.
Collected Metrics¶
Job Overview¶
Aggregated job counts by type (VSphereBackup, WindowsAgentBackup, BackupCopy, etc.):
| Metric | Unit | Description |
|---|---|---|
veeam_jobs_total |
Count | Total enabled jobs with activity in the time window |
veeam_jobs_success |
Count | Jobs with last run successful |
veeam_jobs_warning |
Count | Jobs with last run warnings |
veeam_jobs_failed |
Count | Jobs with last run failed |
veeam_jobs_running |
Count | Jobs currently running |
Job Details¶
Per-job metrics for each active backup job:
| Metric | Unit | Description |
|---|---|---|
veeam_job_status |
Lookup | Last run result (None/Success/Warning/Failed/Running) |
veeam_job_seconds_since |
Seconds | Time since last run |
veeam_job_running_seconds |
Seconds | Elapsed running time of a currently-running job (0 when not running). The supervisor sets the "too long" alert limit; the probe applies no threshold |
veeam_job_objects_count |
Count | Number of objects processed |
veeam_job_bottleneck |
Lookup | Bottleneck type (None/Source/Proxy/Network/Target) |
veeam_job_processed_bytes |
Bytes | Total disk size processed |
veeam_job_read_bytes |
Bytes | Data read from source |
veeam_job_transferred_bytes |
Bytes | Data transferred after dedup/compression |
Repositories¶
Per-repository capacity metrics:
| Metric | Unit | Description |
|---|---|---|
veeam_repo_capacity |
Bytes | Total repository capacity |
veeam_repo_used |
Bytes | Used space |
veeam_repo_free |
Bytes | Free space |
veeam_repo_free_pct |
Percent | Free space percentage |
License¶
| Metric | Unit | Description |
|---|---|---|
veeam_license_status |
Lookup | Valid / Expired / Invalid |
veeam_license_days_left |
Days | Days until license expiration |
veeam_license_instances_total |
Count | Licensed instances |
veeam_license_instances_used |
Count | Used instances |
veeam_license_instances_remaining |
Count | Available instances |
Proxies¶
Per-proxy status:
| Metric | Unit | Description |
|---|---|---|
veeam_proxy_status |
Lookup | Disabled / Offline / Online |
veeam_proxies_total |
Count | Total proxies |
veeam_proxies_enabled |
Count | Enabled proxies |
veeam_proxies_disabled |
Count | Disabled proxies |
Protected Objects¶
Per-object backup status:
| Metric | Unit | Description |
|---|---|---|
veeam_object_restore_points |
Count | Number of restore points |
veeam_object_last_run_failed |
Count | 1 if last backup failed, 0 otherwise |
veeam_objects_total |
Count | Total protected objects |
veeam_objects_failed |
Count | Objects whose last backup failed |
Agent Backups¶
Veeam Agent Backup jobs (physical Windows and Linux machines protected by the Veeam Agent) are not exposed by the Veeam REST /jobs endpoint — only as protected objects. The probe surfaces each agent-managed object as an additional veeam_job_status channel tagged metric_type:jobs_status, so it appears and is coloured by the same Job Status sensor as the VM jobs.
| Metric | Unit | Description |
|---|---|---|
veeam_job_status |
Lookup | Agent backup status: Failed (last run failed), Never Run (no restore point yet), otherwise Success. The job_type tag is WindowsAgentBackup or LinuxAgentBackup |
Because a protected object carries no session timestamp, the Stale and Running states do not apply to agent backups; the restore-point count stays on the veeam_object_restore_points channel above.
Infrastructure¶
Managed server availability:
| Metric | Unit | Description |
|---|---|---|
veeam_server_status |
Lookup | Available / Unavailable |
veeam_servers_total |
Count | Total managed servers |
veeam_servers_available |
Count | Available servers |
veeam_servers_unavailable |
Count | Unavailable servers |
PRTG Integration¶
The probe includes PRTG lookups for status fields. When creating PRTG sensors, use the HTTP Data Advanced sensor type pointing to:
Available categories: overview, jobs, repositories, license, proxies, protected_objects, infrastructure.
Example for job details:
Download the PRTG lookup files from the console (link "Download PRTG lookups" in the Sensor URLs tab of the HTTP output).
Troubleshooting¶
HTTP 403 on startup¶
The Veeam account must have the Backup Administrator role. The REST API does not work with Backup Viewer.
HTTP 500 on job collection¶
Some Veeam installations have job types (e.g., HyperVBackup) that cause server-side errors. The agent handles this automatically by querying jobs per type.
Job type shows "CustomPlatform"¶
Plugin-managed backups (Veeam Backup for Nutanix AHV and other external
modules) are reported by Veeam's /jobs/states endpoint without a standard job
type. The agent labels these as CustomPlatform (Veeam's own term) so they are
grouped and filterable, rather than left as "Unknown".
These jobs also carry less information than a native one, which surprises operators filtering by tag:
- The status is not in
jobs_detail. The job status channel is taggedmetric_type:jobs_status; a query filtering onmetric_type:jobs_detaildeliberately excludes it and returns only Time Since Last Run, Running Duration and Objects Count. Querymetric_type:jobs_statusfor the status. Time Since Last Runis-1, and that is not a failure. Veeam reports no session timestamp for plugin-managed jobs, so the channel carries the "no measurement" sentinel rather than a duration. Do not alert on it for this job type.- No transferred bytes and no bottleneck channels. For the same reason (no session progress from VBR), those channels are not emitted at all.
- The status itself is meaningful. When Veeam reports no last run, the probe falls back to the job's last result, so these jobs show their real Success / Warning / Failed instead of "Never Run".
No job metrics¶
If hours_to_check is too short, jobs that ran outside the time window are excluded. Increase the value (default: 24 hours).
Metric reference¶
Every metric this probe can emit. Metric is the OpenTelemetry name the
OTLP, Prometheus and Zabbix outputs derive theirs from. Name is what a
Nagios check and the API metrics= filter match.
PRTG channel is the label PRTG shows, placeholders filled from the
series' tags.
| Metric | Name | PRTG channel | Unit | Description |
|---|---|---|---|---|
senhub.veeam.job.count |
veeam_jobs_total |
Jobs Total ({job_type}) | # | Backup jobs of this type. Covers the virtual jobs the backup server runs and the agent-managed backups of physical machines, which carry their own job_type (WindowsAgentBackup, LinuxAgentBackup) — so the estate reads whole or split |
senhub.veeam.jobs.by_last_result |
veeam_jobs_success |
Jobs Success ({job_type}) | # | Jobs of this type whose last run succeeded |
senhub.veeam.jobs.by_last_result |
veeam_jobs_warning |
Jobs Warning ({job_type}) | # | Number of jobs with warnings on last run |
senhub.veeam.jobs.by_last_result |
veeam_jobs_failed |
Jobs Failed ({job_type}) | # | Jobs of this type whose last run failed. The number to alert on, together with the age of the last success |
senhub.veeam.jobs.by_last_result |
veeam_jobs_running |
Jobs Running ({job_type}) | # | Number of jobs currently running |
senhub.veeam.jobs.by_last_result |
veeam_jobs_stale |
Jobs Stale ({job_type}) | # | Number of jobs whose last run is older than the configured hours_to_check window (backup cadence drift) |
senhub.veeam.jobs.by_last_result |
veeam_jobs_never_run |
Jobs Never Run ({job_type}) | # | Jobs of this type that have never produced a restore point. A job configured and never run is not a healthy job |
senhub.veeam.job.status |
veeam_job_status |
Job Status ({job_name}) | # | Effective job status: 0=NeverRun, 1=Success, 2=Warning, 3=Failed, 4=Running, 5=Stale (last run older than hours_to_check window) |
senhub.veeam.job.seconds_since_last_run |
veeam_job_seconds_since |
Time Since Last Run ({job_name}) | s | Time elapsed since the last job run |
senhub.veeam.job.running_duration |
veeam_job_running_seconds |
Running Duration ({job_name}) | s | Elapsed running time of a currently-running job (0 when not running). The supervisor sets the 'too long' alert limit; the probe applies no threshold. |
senhub.veeam.job.objects |
veeam_job_objects_count |
Objects Count ({job_name}) | # | Number of objects processed by the job |
senhub.veeam.job.bottleneck.status |
veeam_job_bottleneck |
Bottleneck ({job_name}) | # | Bottleneck type: 0=None, 1=Source, 2=Proxy, 3=Network, 4=Target |
senhub.veeam.job.last_run.bytes |
veeam_job_processed_bytes |
Processed ({job_name}) | Bytes | Total size of all disks processed |
senhub.veeam.job.last_run.bytes |
veeam_job_read_bytes |
Read ({job_name}) | Bytes | Data read from source before compression/dedup |
senhub.veeam.job.last_run.bytes |
veeam_job_transferred_bytes |
Transferred ({job_name}) | Bytes | Data transferred after compression/dedup |
senhub.veeam.repository.limit |
veeam_repo_capacity |
Repository Capacity ({repo_name}) | Bytes | Total capacity of the backup repository |
senhub.veeam.repository.usage |
veeam_repo_used |
Repository Used ({repo_name}) | Bytes | Used space in the backup repository |
senhub.veeam.repository.usage |
veeam_repo_free |
Repository Free ({repo_name}) | Bytes | Free space available in the backup repository |
senhub.veeam.repository.utilization |
veeam_repo_free_pct |
Repository Free % ({repo_name}) | % | Percentage of free space in the backup repository |
senhub.veeam.license.status |
veeam_license_status |
License Status | # | License status: 0=Valid, 1=Expired, 2=Invalid |
senhub.veeam.license.expiry |
veeam_license_days_left |
License Days Left | days | Number of days until the Veeam license expires |
senhub.veeam.license.instances |
veeam_license_instances_total |
Licensed Instances Total | # | Total number of licensed instances |
senhub.veeam.license.instances |
veeam_license_instances_used |
Licensed Instances Used | # | Number of licensed instances currently in use |
senhub.veeam.license.instances |
veeam_license_instances_remaining |
Licensed Instances Remaining | # | Number of licensed instances still available |
senhub.veeam.proxy.status |
veeam_proxy_status |
Proxy Status ({proxy_name}) | # | Proxy status: 0=Disabled, 1=Offline, 2=Online |
senhub.veeam.proxies |
veeam_proxies_total |
Proxies Total | # | Total number of configured backup proxies |
senhub.veeam.proxies |
veeam_proxies_enabled |
Proxies Enabled | # | Number of enabled backup proxies |
senhub.veeam.proxies |
veeam_proxies_disabled |
Proxies Disabled | # | Number of disabled backup proxies |
senhub.veeam.object.restore_points |
veeam_object_restore_points |
Restore Points ({object_name} / {object_type}) | # | Number of restore points for this object |
senhub.veeam.object.last_run_failed |
veeam_object_last_run_failed |
Last Run Failed ({object_name} / {object_type}) | # | 1 if last backup run failed, 0 otherwise |
senhub.veeam.objects |
veeam_objects_total |
Protected Objects Total | # | Total number of protected backup objects |
senhub.veeam.objects |
veeam_objects_failed |
Protected Objects Failed | # | Number of objects whose last backup failed |
senhub.veeam.objects.without_job_status |
veeam_objects_without_job_status |
Protected Objects Without Status ({platform}) | # | Protected objects of this platform that get no job-status channel, because the platform is not one the agent surfaces as an agent backup. Above zero means backups exist that the consolidated job sensor cannot show — the platform name says which |
senhub.veeam.server.status |
veeam_server_status |
Server Status ({server_name}) | # | Server availability: 0=Unavailable, 1=Available |
senhub.veeam.servers |
veeam_servers_total |
Managed Servers Total | # | Total number of managed servers |
senhub.veeam.servers |
veeam_servers_available |
Managed Servers Available | # | Number of available managed servers |
senhub.veeam.servers |
veeam_servers_unavailable |
Managed Servers Unavailable | # | Number of unavailable managed servers |