--- proxmox_ve_by_http_original.yaml +++ proxmox_ve_by_http_with_snapshots.yaml @@ -186,6 +186,6 @@ filter: evaltype: AND conditions: - macro: '{#RESOURCE.TYPE}' value: ^lxc$ @@ -419,6 +419,77 @@ - tag: node value: '{#NODE.NAME}' + - uuid: 7ece2f76f41a469e848395931a809bf1 + name: 'LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: Snapshot max age' + type: DEPENDENT + key: 'proxmox.lxc.snapshot.age[{#LXC.ID}]' + delay: '0' + units: s + description: 'Age of oldest snapshot in seconds.' + preprocessing: + - type: JAVASCRIPT + parameters: + - | + try { + var data = JSON.parse(value).data; + var snapshots = data.filter(function(s) { return s.name !== 'current'; }); + if (snapshots.length === 0) return 0; + var now = Math.floor(Date.now() / 1000); + var oldest = Math.min.apply(null, snapshots.map(function(s) { return s.snaptime || now; })); + return now - oldest; + } catch (e) { + return 0; + } + master_item: + key: 'proxmox.lxc.snapshots[{#LXC.ID}]' + tags: + - tag: component + value: snapshot + - tag: lxc + value: '{#LXC.ID}' + - tag: name + value: '{#LXC.NAME}' + - tag: node + value: '{#NODE.NAME}' + - uuid: 2d8c7c1394aa44fd95a187f3747321f6 + name: 'LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: Snapshot count' + type: DEPENDENT + key: 'proxmox.lxc.snapshot.count[{#LXC.ID}]' + delay: '0' + description: 'Number of snapshots (excluding current).' + preprocessing: + - type: JSONPATH + parameters: + - '$.data[?(@.name != "current")].length()' + error_handler: CUSTOM_VALUE + error_handler_params: '0' + master_item: + key: 'proxmox.lxc.snapshots[{#LXC.ID}]' + tags: + - tag: component + value: snapshot + - tag: lxc + value: '{#LXC.ID}' + - tag: name + value: '{#LXC.NAME}' + - tag: node + value: '{#NODE.NAME}' + - uuid: 4879f45df9e043efa10a6fa5d9610d10 + name: 'LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: Snapshot data' + type: HTTP_AGENT + key: 'proxmox.lxc.snapshots[{#LXC.ID}]' + delay: 5m + history: '0' + value_type: TEXT + description: 'Get LXC snapshot list.' + url: 'https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/{#LXC.ID}/snapshot' + headers: + - name: Authorization + value: 'PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}' + tags: + - tag: component + value: snapshot + - tag: lxc + value: '{#LXC.ID}' + - tag: name + value: '{#LXC.NAME}' + - tag: node + value: '{#NODE.NAME}' - uuid: bd213f6de4db4e1e84894b80acffa330 name: 'LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: Uptime' type: DEPENDENT @@ -484,6 +555,16 @@ - tag: scope value: notice trigger_prototypes: + - uuid: 90d0ad425bc841fea3029c4743d2cfee + expression: '(last(/Proxmox VE by HTTP/proxmox.lxc.snapshot.count[{#LXC.ID}])>{$PVE.SNAPSHOT.COUNT.MAX.WARN} and min(/Proxmox VE by HTTP/proxmox.lxc.snapshot.count[{#LXC.ID}],1h)>{$PVE.SNAPSHOT.COUNT.MAX.WARN}) or (last(/Proxmox VE by HTTP/proxmox.lxc.snapshot.age[{#LXC.ID}])>{$PVE.SNAPSHOT.AGE.MAX.WARN} and min(/Proxmox VE by HTTP/proxmox.lxc.snapshot.age[{#LXC.ID}],1h)>{$PVE.SNAPSHOT.AGE.MAX.WARN})' + name: 'Proxmox VE: LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: Snapshot issue detected' + event_name: 'Proxmox VE: LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: Too many or old snapshots' + opdata: 'Count: {ITEM.LASTVALUE1}, Max age: {ITEM.LASTVALUE2}s' + priority: WARNING + description: 'Either more than {$PVE.SNAPSHOT.COUNT.MAX.WARN} snapshots exist or oldest snapshot is older than {$PVE.SNAPSHOT.AGE.MAX.WARN} seconds (24h).' + tags: + - tag: scope + value: capacity - uuid: 1e362fac13634a3dabebbd6ceb59879f expression: 'min(/Proxmox VE by HTTP/proxmox.lxc.disk[{#LXC.ID}],5m) / last(/Proxmox VE by HTTP/proxmox.lxc.maxdisk[{#LXC.ID}]) * 100 > {$PVE.LXC.DISK.PUSE.MAX.WARN:"{#LXC.ID}"}' name: 'Proxmox VE: LXC [{#NODE.NAME}/{#LXC.NAME} ({#LXC.ID})]: high disk space usage' @@ -1111,6 +1108,6 @@ filter: evaltype: AND conditions: - macro: '{#RESOURCE.TYPE}' value: ^qemu$ item_prototypes: @@ -1352,6 +1433,77 @@ - tag: qemu value: '{#QEMU.ID}' + - uuid: 26f4c9df03d44bcf92a8237007ca9cdc + name: 'VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})]: Snapshot max age' + type: DEPENDENT + key: 'proxmox.qemu.snapshot.age[{#QEMU.ID}]' + delay: '0' + units: s + description: 'Age of oldest snapshot in seconds.' + preprocessing: + - type: JAVASCRIPT + parameters: + - | + try { + var data = JSON.parse(value).data; + var snapshots = data.filter(function(s) { return s.name !== 'current'; }); + if (snapshots.length === 0) return 0; + var now = Math.floor(Date.now() / 1000); + var oldest = Math.min.apply(null, snapshots.map(function(s) { return s.snaptime || now; })); + return now - oldest; + } catch (e) { + return 0; + } + master_item: + key: 'proxmox.qemu.snapshots[{#QEMU.ID}]' + tags: + - tag: component + value: snapshot + - tag: name + value: '{#QEMU.NAME}' + - tag: node + value: '{#NODE.NAME}' + - tag: qemu + value: '{#QEMU.ID}' + - uuid: 0e67756159f142f0a7951bf1cb66261b + name: 'VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})]: Snapshot count' + type: DEPENDENT + key: 'proxmox.qemu.snapshot.count[{#QEMU.ID}]' + delay: '0' + description: 'Number of snapshots (excluding current).' + preprocessing: + - type: JSONPATH + parameters: + - '$.data[?(@.name != "current")].length()' + error_handler: CUSTOM_VALUE + error_handler_params: '0' + master_item: + key: 'proxmox.qemu.snapshots[{#QEMU.ID}]' + tags: + - tag: component + value: snapshot + - tag: name + value: '{#QEMU.NAME}' + - tag: node + value: '{#NODE.NAME}' + - tag: qemu + value: '{#QEMU.ID}' + - uuid: 39097ea7c26341c7964548aa620202f5 + name: 'VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})]: Snapshot data' + type: HTTP_AGENT + key: 'proxmox.qemu.snapshots[{#QEMU.ID}]' + delay: 5m + history: '0' + value_type: TEXT + description: 'Get VM snapshot list.' + url: 'https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/{#QEMU.ID}/snapshot' + headers: + - name: Authorization + value: 'PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}' + tags: + - tag: component + value: snapshot + - tag: name + value: '{#QEMU.NAME}' + - tag: node + value: '{#NODE.NAME}' + - tag: qemu + value: '{#QEMU.ID}' - uuid: 77ba70e0ce6f486585f870d3b57033ba name: 'VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})]: Uptime' type: DEPENDENT @@ -1417,6 +1569,16 @@ - tag: scope value: notice trigger_prototypes: + - uuid: de6b4be6b7f14c70a896e230d92f7e86 + expression: '(last(/Proxmox VE by HTTP/proxmox.qemu.snapshot.count[{#QEMU.ID}])>{$PVE.SNAPSHOT.COUNT.MAX.WARN} and min(/Proxmox VE by HTTP/proxmox.qemu.snapshot.count[{#QEMU.ID}],1h)>{$PVE.SNAPSHOT.COUNT.MAX.WARN}) or (last(/Proxmox VE by HTTP/proxmox.qemu.snapshot.age[{#QEMU.ID}])>{$PVE.SNAPSHOT.AGE.MAX.WARN} and min(/Proxmox VE by HTTP/proxmox.qemu.snapshot.age[{#QEMU.ID}],1h)>{$PVE.SNAPSHOT.AGE.MAX.WARN})' + name: 'Proxmox VE: VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})]: Snapshot issue detected' + event_name: 'Proxmox VE: VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})]: Too many or old snapshots' + opdata: 'Count: {ITEM.LASTVALUE1}, Max age: {ITEM.LASTVALUE2}s' + priority: WARNING + description: 'Either more than {$PVE.SNAPSHOT.COUNT.MAX.WARN} snapshots exist or oldest snapshot is older than {$PVE.SNAPSHOT.AGE.MAX.WARN} seconds (24h).' + tags: + - tag: scope + value: capacity - uuid: 5305bf2b71aa4b74917379c6e1b3c065 expression: 'min(/Proxmox VE by HTTP/proxmox.qemu.mem[{#QEMU.ID}],5m) / last(/Proxmox VE by HTTP/proxmox.qemu.maxmem[{#QEMU.ID}]) * 100 >{$PVE.VM.MEMORY.PUSE.MAX.WARN:"{#QEMU.ID}"}' name: 'Proxmox VE: VM [{#NODE.NAME}/{#QEMU.NAME} ({#QEMU.ID})] high memory usage' @@ -1629,6 +1791,14 @@ - macro: '{$PVE.ROOT.PUSE.MAX.WARN}' value: '90' description: 'Maximum used root space in percentage.' + - macro: '{$PVE.SNAPSHOT.AGE.MAX.WARN}' + value: '86400' + description: 'Maximum age of oldest snapshot in seconds (default 24h = 86400s) before triggering a warning.' + - macro: '{$PVE.SNAPSHOT.COUNT.MAX.WARN}' + value: '6' + description: 'Maximum number of snapshots before triggering a warning.' - macro: '{$PVE.STORAGE.PUSE.MAX.WARN}' value: '90' description: 'Maximum used storage space in percentage.'