5.02021-11-21T22:03:44ZTemplates/ApplicationsApp BackupPC by Zabbix agentApp BackupPC by Zabbix agent## Description
The template to monitor BackupPC metrics API by Zabbix agent without need for extra scripts on server. Template Version v0.0.1 - Evren Yurtesen Tested on Zabbix5 and BackupPC 4.4.1 (needs updated metrics)
## Overview
Please see the GitHub repository for newest version and reporting issues.
<https://github.com/yurtesen/zabbix_backuppc>
This template requires no external scripts.
It is tested with latest BackupPC which has updated metrics. It may function partially in older BackupPC versions.
https://github.com/backuppc/backuppc/pull/391
## Author
Evren Yurtesen
Templates/ApplicationsBackupPCZabbix raw items- Disk usageDEPENDENTbackuppc.disk.usage0%BackupPCJSONPATH$.disk.usageDISCARD_UNCHANGED_HEARTBEAT1dweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]
- Inode usageDEPENDENTbackuppc.inode.usage0%BackupPCJSONPATH$.inode.usageDISCARD_UNCHANGED_HEARTBEAT1dweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]
- Determine last backup dataDEPENDENTbackuppc.metrics.last000TEXTZabbix raw itemsJAVASCRIPTvar obj = JSON.parse(value);
for (var key in obj['hosts']) {
Object.assign(obj['hosts'][key], getLastBackupData(obj['hosts'][key]));
}
return JSON.stringify(obj);
function getLastBackupData(hostArray) {
var lastBackup = {};
var lastBackupType;
if (hostArray['full_age'] > hostArray['incr_age']) {
lastBackupType = 'full';
} else {
lastBackupType = 'incr';
}
for (var key in hostArray) {
if (key.startsWith(lastBackupType)) {
var subKey = key.substring(lastBackupType.length);
lastBackup['last' + subKey] = hostArray[key];
}
}
return lastBackup;
}web.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]
- Start timeDEPENDENTbackuppc.server.start_time00unixtimeBackupPCJSONPATH$.server.start_timeDISCARD_UNCHANGED_HEARTBEAT1dweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]
- VersionDEPENDENTbackuppc.server.version00CHARBackupPCJSONPATH$.server.versionDISCARD_UNCHANGED_HEARTBEAT1dweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]
- BackupPC get metricsweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]5m00TEXTFetches BackupPC server metricsZabbix raw itemsREGEX\n\s?\n(.*)
\1
Discover backed up hostsDEPENDENTbackuppc.hosts.discovery0[{#HOST}] DisabledDEPENDENTbackuppc.disabled.[{#HOST}]07d0BackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].disabledDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] ErrorDEPENDENTbackuppc.error.[{#HOST}]00CHARBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].errorDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Full countDEPENDENTbackuppc.full_count.[{#HOST}]07d0BackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].full_countDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Full durationDEPENDENTbackuppc.full_duration.[{#HOST}]0sBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].full_durationDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Full keep countDEPENDENTbackuppc.full_keep_count.[{#HOST}]07d0BackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].full_keep_countDISCARD_UNCHANGED_HEARTBEAT1hJAVASCRIPTif (isNaN(value)) {
myValue = JSON.parse(value);
} else {
return value;
}
var sum = 0;
for (var i = 0; i < myValue.length; i += 1) {
sum += myValue[i];
}
return sum;web.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Full rateDEPENDENTbackuppc.full_rate.[{#HOST}]0BpsBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].full_rateDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Full sizeDEPENDENTbackuppc.full_size.[{#HOST}]0BBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].full_sizeDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Full start timeDEPENDENTbackuppc.full_start_time.[{#HOST}]0unixtimeBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].full_start_timeDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Incr countDEPENDENTbackuppc.incr_count.[{#HOST}]07d0BackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].incr_countDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Incr durationDEPENDENTbackuppc.incr_duration.[{#HOST}]0sBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].incr_durationDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Incr keep countDEPENDENTbackuppc.incr_keep_count.[{#HOST}]07d0BackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].incr_keep_countDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Incr rateDEPENDENTbackuppc.incr_rate.[{#HOST}]0BpsBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].incr_rateDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Incr sizeDEPENDENTbackuppc.incr_size.[{#HOST}]0BBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].incr_sizeDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Incr start timeDEPENDENTbackuppc.incr_start_time.[{#HOST}]0unixtimeBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].incr_start_timeDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] Last # of new filesDEPENDENTbackuppc.last_nfiles_new.[{#HOST}]0BackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].last_nfiles_newDISCARD_UNCHANGED_HEARTBEAT1hbackuppc.metrics.last[{#HOST}] Last sizeDEPENDENTbackuppc.last_size.[{#HOST}]0BBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].last_sizeDISCARD_UNCHANGED_HEARTBEAT1hbackuppc.metrics.last[{#HOST}] Last new files sizeDEPENDENTbackuppc.last_size_new.[{#HOST}]0BBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].last_size_newDISCARD_UNCHANGED_HEARTBEAT1hbackuppc.metrics.last[{#HOST}] Last start timeDEPENDENTbackuppc.last_start_time.[{#HOST}]0unixtimeBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].last_start_timeDISCARD_UNCHANGED_HEARTBEAT1hbackuppc.metrics.last[{#HOST}] ReasonDEPENDENTbackuppc.reason.[{#HOST}]00CHARBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].reasonDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics][{#HOST}] StateDEPENDENTbackuppc.state.[{#HOST}]00CHARBackupPC {#HOST}JSONPATH$.hosts.['{#HOST}'].stateDISCARD_UNCHANGED_HEARTBEAT1hweb.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]{App BackupPC by Zabbix agent:backuppc.error.[{#HOST}].strlen()}<>0 and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0{#HOST}: Backup errorINFO{ITEM.LASTVALUE1}YES{App BackupPC by Zabbix agent:backuppc.last_start_time.[{#HOST}].fuzzytime({$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"})}=0 and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0{#HOST}: No new backups for {$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"}AVERAGENo backups were taken for {$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"}
Critical period per backup server or per backup host can be adjusted.YES{App BackupPC by Zabbix agent:backuppc.last_start_time.[{#HOST}].fuzzytime({$BACKUPPC.OLDBACKUP.WARN:"{#HOST}"})}=0 and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0{#HOST}: No new backups for {$BACKUPPC.OLDBACKUP.WARN:"{#HOST}"}WARNINGNo backups were taken for {$BACKUPPC.OLDBACKUP.WARN:"{#HOST}"}
Warning period per backup server or per backup host can be adjusted.YES{#HOST}: No new backups for {$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"}{App BackupPC by Zabbix agent:backuppc.last_start_time.[{#HOST}].fuzzytime({$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"})}=0 and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0({App BackupPC by Zabbix agent:backuppc.full_count.[{#HOST}].last()}<{App BackupPC by Zabbix agent:backuppc.full_keep_count.[{#HOST}].last()}) and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0{#HOST}: Not enough full backupsINFO{ITEM.LASTVALUE1} full backup(s) exist which is less than configured {ITEM.LASTVALUE2} full backup(s) value for this host
A newly added most may not have enough full backupsYES({App BackupPC by Zabbix agent:backuppc.incr_count.[{#HOST}].last()}<{App BackupPC by Zabbix agent:backuppc.incr_keep_count.[{#HOST}].last()}) and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0{#HOST}: Not enough incr backupsINFO{ITEM.LASTVALUE1} incr backup(s) exist which is less than configured {ITEM.LASTVALUE2} incr backup(s) value for this host
A newly added most may not have enough incremental backupsYES{App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0 and ({App BackupPC by Zabbix agent:backuppc.last_size_new.[{#HOST}].last()}>{$BACKUPPC.SIZECHANGE.CRIT} or {App BackupPC by Zabbix agent:backuppc.last_size.[{#HOST}].abschange()}>{$BACKUPPC.SIZECHANGE.CRIT}){#HOST}: Size difference larger than {$BACKUPPC.SIZECHANGE.CRIT:"{#HOST}"}AVERAGEThere are new files larger than or size difference larger than {$BACKUPPC.SIZECHANGE.CRIT:"{#HOST}"} between last backup and previus backup.
Critical size per backup server or per backup host can be adjusted.YES{App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0 and ({App BackupPC by Zabbix agent:backuppc.last_size_new.[{#HOST}].last()}>{$BACKUPPC.SIZECHANGE.WARN} or {App BackupPC by Zabbix agent:backuppc.last_size.[{#HOST}].abschange()}>{$BACKUPPC.SIZECHANGE.WARN}){#HOST}: Size difference larger than {$BACKUPPC.SIZECHANGE.WARN:"{#HOST}"}WARNINGThere are new files larger than or size difference larger than {$BACKUPPC.SIZECHANGE.WARN:"{#HOST}"} between last backup and previus backup.
Warning size per backup server or per backup host can be adjusted.YES{#HOST}: No new backups for {$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"}{App BackupPC by Zabbix agent:backuppc.last_start_time.[{#HOST}].fuzzytime({$BACKUPPC.OLDBACKUP.CRIT:"{#HOST}"})}=0 and {App BackupPC by Zabbix agent:backuppc.disabled.[{#HOST}].last()}=0web.page.get[{$BACKUPPC.SCHEME}://{$BACKUPPC.USERNAME}:{$BACKUPPC.PASSWORD}@{$BACKUPPC.HOST}:{$BACKUPPC.PORT}/{$BACKUPPC.PATH}?action=metrics]JAVASCRIPTvar obj = JSON.parse(value);
return JSON.stringify(Object.keys(obj['hosts']).map(lldFunction));
function lldFunction(hostname) {
return { '{#HOST}': hostname };
}{$BACKUPPC.HOST}127.0.0.1Hostname or IP of the BackupPC server.{$BACKUPPC.OLDBACKUP.CRIT}7dDays before critical old backups{$BACKUPPC.OLDBACKUP.WARN}3dDays before warning old backups{$BACKUPPC.PASSWORD}backuppcPassword of username which can access metrics of the BackupPC server.{$BACKUPPC.PATH}/backuppcPath to BackupPC web interface{$BACKUPPC.PORT}443HTTP/HTTPS port{$BACKUPPC.SCHEME}httpsMetrics access scheme (http/https).{$BACKUPPC.SIZECHANGE.CRIT}5GCrit backup `size` or `new files size` difference{$BACKUPPC.SIZECHANGE.WARN}1GWarn backup `size` or `new files size` difference{$BACKUPPC.USERNAME}backuppcMetrics access username.