Compare commits

...

7 Commits

Author SHA1 Message Date
damage 743cd830c6 switch items to descard unchanged with heartbeat 2026-04-20 20:31:51 +02:00
damage 30467c50a8 add patmed template 2026-04-19 12:35:32 +02:00
damage 287efe373d fix: max_by had wrong exp and just returned last from array 2026-04-02 18:53:00 +02:00
damage bbd1c6f6c0 reduce check to 1h, add tags 2026-04-02 17:08:49 +02:00
damage dcf12b9d34 I am confused!
Wait, maybe I am not!
2026-04-02 16:56:17 +02:00
damage 5aa9645a83 add proxmox backup server template 2026-04-02 16:55:33 +02:00
damage 70009b58b3 group backups by datastore, namespace, backup-type and backup-id 2026-04-02 16:24:12 +02:00
4 changed files with 224 additions and 6 deletions
@@ -0,0 +1,91 @@
zabbix_export:
version: '7.4'
template_groups:
- uuid: cd6848345eb04289b2d5260c10e0d269
name: devloop
- uuid: a571c0d144b14fd4a87a9d9b2aa9fcd6
name: Templates/Applications
templates:
- uuid: 9e713ad0b15346b3aeb1913ffd928988
template: 'Template App PatMed by Zabbix agent active'
name: 'Template App PatMed by Zabbix agent active'
vendor:
name: devloop
version: '1.1'
groups:
- name: devloop
- name: Templates/Applications
items:
- uuid: 123ba14e7cfd4ef2b8caeca47fa4b5ac
name: 'PatMed Version Available'
type: HTTP_AGENT
key: devloop.patmed.version.available
delay: 1h
history: 365d
value_type: TEXT
preprocessing:
- type: JSONPATH
parameters:
- $.version
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1d
url: 'https://portal.production.patmed.de/api/v1/version/latest-gateway-version'
post_type: JSON
posts: '{"version":"284", "os":"WINDOWS","arch":"AMD64","currentChannel":"RELEASE","requestStaging":false}'
request_method: POST
verify_peer: 'YES'
verify_host: 'YES'
- uuid: 78458591c0f047c784f131226f8bf5c7
name: 'PatMed Version Current'
type: ZABBIX_ACTIVE
key: devloop.patmed.version.current
delay: 1h
history: 365d
value_type: TEXT
preprocessing:
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1d
- uuid: 4f587dcd6df9438099ffe1ac5d49819e
name: 'PatMed Gateway Process'
type: ZABBIX_ACTIVE
key: 'proc.num[java,,,gateway/app/app.jar]'
triggers:
- uuid: ed3f2943b30345958e75ee57e2a95b0f
expression: 'last(/Template App PatMed by Zabbix agent active/proc.num[java,,,gateway/app/app.jar])<1'
name: 'PatMed Java Gateway Process not available'
priority: HIGH
tags:
- tag: Application
value: PatMed
- tag: Application
value: T2MED
- tag: ApplicationType
value: Medical
triggers:
- uuid: 2c9926b988b64fc0a948e1210fbdaf78
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available)'
name: 'PatMed Update Available (Stage 1)'
priority: INFO
dependencies:
- name: 'PatMed Update Available (Stage 2)'
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available,#1:now-1h)'
- uuid: fb2dcabcb76a481eba3f9e94428d5d9c
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available,#1:now-1h)'
name: 'PatMed Update Available (Stage 2)'
priority: WARNING
dependencies:
- name: 'PatMed Update Available (Stage 3)'
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available,#1:now-2h)'
- uuid: 57e1dee126af429c8c4f9ac29168510a
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available,#1:now-2h)'
name: 'PatMed Update Available (Stage 3)'
priority: AVERAGE
dependencies:
- name: 'PatMed Update Available (Stage 4)'
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available,#1:now-3h)'
- uuid: 85ed40b8575241708e516156ec028602
expression: 'last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.current)<>last(/Template App PatMed by Zabbix agent active/devloop.patmed.version.available,#1:now-3h)'
name: 'PatMed Update Available (Stage 4)'
priority: HIGH
+6
View File
@@ -0,0 +1,6 @@
## Install
* copy `pbs.sh` into `/usr/local/bin`
* install `jq`
## API permissions
* `Audit` on every datastore which should be monitored
+12 -6
View File
@@ -12,15 +12,21 @@ IFS='
for datastore in $(echo "${datastores}" |jq --raw-output '.data[].store'); do for datastore in $(echo "${datastores}" |jq --raw-output '.data[].store'); do
namespaces=$(wget --header="Authorization: PBSAPIToken=${TOKENID}:${TOKENSECRET}" --content-on-error -q -O - "https://${HOST}:${PORT}/api2/json/admin/datastore/${datastore}/namespace") namespaces=$(wget --header="Authorization: PBSAPIToken=${TOKENID}:${TOKENSECRET}" --content-on-error -q -O - "https://${HOST}:${PORT}/api2/json/admin/datastore/${datastore}/namespace")
ret_namespaces=""
for namespace in $(echo "${namespaces}" |jq --raw-output '.data[].ns'); do for namespace in $(echo "${namespaces}" |jq --raw-output '.data[].ns'); do
backups=$(wget --header="Authorization: PBSAPIToken=${TOKENID}:${TOKENSECRET}" --content-on-error -q -O - "https://${HOST}:${PORT}/api2/json/admin/datastore/${datastore}/snapshots?ns=${namespace}") # group backups by backup-type and backup-id, only get the backup of each group (thus the map) with max backup-time and add datastore and namespace to each backup
backups_json=$(echo "${backups}" |jq '.data') temp=$(wget --header="Authorization: PBSAPIToken=${TOKENID}:${TOKENSECRET}" --content-on-error -q -O - "https://${HOST}:${PORT}/api2/json/admin/datastore/${datastore}/snapshots?ns=${namespace}" |jq ".data |group_by([.\"backup-type\", .\"backup-id\"]) |map(max_by(.\"backup-time\")) |map(.datastore |= \"${datastore}\") |map(.namespace |= \"${namespace}\")")
ret_namespaces="${ret_namespaces}{\"${namespace}\":${backups_json}},"
# remove array symbols ([ and ])
temp="${temp:1}"
temp="${temp::-1}"
if [[ "${#temp}" -ne 0 ]]; then
backups="${backups}${temp},"
fi
done done
ret_datastores="${ret_datastores}{\"${datastore}\":[${ret_namespaces::-1}]},"
done done
ret="[${ret_datastores::-1}]" # remove last set comma
ret="[${backups::-1}]"
echo $ret echo $ret
@@ -0,0 +1,115 @@
zabbix_export:
version: '7.0'
template_groups:
- uuid: cd6848345eb04289b2d5260c10e0d269
name: devloop
- uuid: a571c0d144b14fd4a87a9d9b2aa9fcd6
name: Templates/Applications
templates:
- uuid: a0ed4ae0737d47c48938583a15510344
template: 'PBS Backup Status Active'
name: 'PBS Backup Status Active'
vendor:
name: devloop
version: '1.1'
groups:
- name: devloop
- name: Templates/Applications
items:
- uuid: a0be013137cf4cd1b579c419cbace3c5
name: 'PBS JSON'
type: ZABBIX_ACTIVE
key: 'devloop.pbs[{HOST.CONN},{$DEVLOOP.PBS.API.PORT},{$DEVLOOP.PBS.API.USER.NAME},{$DEVLOOP.PBS.API.USER.REALM},{$DEVLOOP.PBS.API.USER.TOKEN},{$DEVLOOP.PBS.API.TOKENSECRET}]'
delay: 1h
history: 1h
value_type: TEXT
trends: '0'
discovery_rules:
- uuid: 5bfb062fc9b444888a6013a4d225c843
name: PBS
type: DEPENDENT
key: devloop.pbs.discover
delay: '0'
item_prototypes:
- uuid: c94d7d2c7d354d21bf25d209e2be056b
name: 'PBS Backup Size {#DATASTORE}.{#NAMESPACE} {#BACKUP_TYPE}-{#BACKUP_ID}'
type: DEPENDENT
key: 'devloop.pbs.backup.size[{#DATASTORE}, {#NAMESPACE}, {#BACKUP_TYPE}, {#BACKUP_ID}]'
delay: '0'
units: B
preprocessing:
- type: JSONPATH
parameters:
- '$[0].size'
master_item:
key: 'devloop.pbs.backup[{#DATASTORE}, {#NAMESPACE}, {#BACKUP_TYPE}, {#BACKUP_ID}]'
tags:
- tag: devloop.pbs.backup
value: '{#BACKUP_TYPE}-{#BACKUP_ID}'
- tag: devloop.pbs.backup-id
value: '{#BACKUP_ID}'
- tag: devloop.pbs.backup-type
value: '{#BACKUP_TYPE}'
- tag: devloop.pbs.datastore
value: '{#DATASTORE}'
- tag: devloop.pbs.namespace
value: '{#NAMESPACE}'
- uuid: 30de20ba2d2841b186439b27a1ba4c38
name: 'PBS Backup Timestamp {#DATASTORE}.{#NAMESPACE} {#BACKUP_TYPE}-{#BACKUP_ID}'
type: DEPENDENT
key: 'devloop.pbs.backup.timestamp[{#DATASTORE}, {#NAMESPACE}, {#BACKUP_TYPE}, {#BACKUP_ID}]'
delay: '0'
units: unixtime
preprocessing:
- type: JSONPATH
parameters:
- '$[0]["backup-time"]'
master_item:
key: 'devloop.pbs.backup[{#DATASTORE}, {#NAMESPACE}, {#BACKUP_TYPE}, {#BACKUP_ID}]'
tags:
- tag: devloop.pbs.backup
value: '{#BACKUP_TYPE}-{#BACKUP_ID}'
- tag: devloop.pbs.backup-id
value: '{#BACKUP_ID}'
- tag: devloop.pbs.backup-type
value: '{#BACKUP_TYPE}'
- tag: devloop.pbs.datastore
value: '{#DATASTORE}'
- tag: devloop.pbs.namespace
value: '{#NAMESPACE}'
- uuid: bddc15b366be444ebf12d9f2d54ba196
name: 'PBS Backup {#DATASTORE}.{#NAMESPACE} {#BACKUP_TYPE}-{#BACKUP_ID} JSON'
type: DEPENDENT
key: 'devloop.pbs.backup[{#DATASTORE}, {#NAMESPACE}, {#BACKUP_TYPE}, {#BACKUP_ID}]'
delay: '0'
history: 1h
value_type: TEXT
trends: '0'
preprocessing:
- type: JSONPATH
parameters:
- '$[?(@.datastore==''{#DATASTORE}'' && @.namespace==''{#NAMESPACE}'' && @["backup-type"]==''{#BACKUP_TYPE}'' && @["backup-id"]==''{#BACKUP_ID}'')]'
master_item:
key: 'devloop.pbs[{HOST.CONN},{$DEVLOOP.PBS.API.PORT},{$DEVLOOP.PBS.API.USER.NAME},{$DEVLOOP.PBS.API.USER.REALM},{$DEVLOOP.PBS.API.USER.TOKEN},{$DEVLOOP.PBS.API.TOKENSECRET}]'
master_item:
key: 'devloop.pbs[{HOST.CONN},{$DEVLOOP.PBS.API.PORT},{$DEVLOOP.PBS.API.USER.NAME},{$DEVLOOP.PBS.API.USER.REALM},{$DEVLOOP.PBS.API.USER.TOKEN},{$DEVLOOP.PBS.API.TOKENSECRET}]'
lld_macro_paths:
- lld_macro: '{#BACKUP_ID}'
path: '$["backup-id"]'
- lld_macro: '{#BACKUP_TYPE}'
path: '$["backup-type"]'
- lld_macro: '{#DATASTORE}'
path: $.datastore
- lld_macro: '{#NAMESPACE}'
path: $.namespace
macros:
- macro: '{$DEVLOOP.PBS.API.PORT}'
value: '8007'
description: 'default 8007'
- macro: '{$DEVLOOP.PBS.API.TOKENSECRET}'
description: xxx-xxx-xxx-xxx
- macro: '{$DEVLOOP.PBS.API.USER.NAME}'
- macro: '{$DEVLOOP.PBS.API.USER.REALM}'
description: 'e.g. pbs'
- macro: '{$DEVLOOP.PBS.API.USER.TOKEN}'
description: 'token name'