Skip to content

Commit 9a73c71

Browse files
Gianni Stubbe33Fraise33
authored andcommitted
fix: Further PBS monitoring fixes
1 parent 6428baf commit 9a73c71

6 files changed

Lines changed: 161 additions & 108 deletions

File tree

playbooks/host_files/beokpdcovm01/files/prometheus/alerts.d/pbs.rules.yml

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,77 @@
22
groups:
33
- name: pbs.rules
44
rules:
5-
- alert: PBS - Backup Failed
6-
expr: pbs_task_status{task_type="backup",status=~"(?i:failed|error)"} == 1
5+
- alert: PBS - Down
6+
expr: pbs_up == 0
77
for: 10m
88
labels:
99
severity: critical
1010
annotations:
11-
summary: "PBS backup failed on {{ $labels.node_name }}"
12-
description: "Backup {{ $labels.task }} for datastore {{ $labels.datastore }} failed."
11+
summary: "PBS Offline"
12+
description: "PBS job is not returning a healthy state."
1313

14-
- alert: PBS - Verification Failed
15-
expr: pbs_task_status{task_type="verify",status=~"(?i:failed|error)"} == 1
14+
- alert: PBS - Verification Not Successful
15+
expr: pbs_snapshot_vm_last_verify == 0
1616
for: 10m
1717
labels:
1818
severity: critical
1919
annotations:
20-
summary: "PBS verification failed on {{ $labels.node_name }}"
21-
description: "Verification {{ $labels.task }} for datastore {{ $labels.datastore }} failed."
20+
summary: "PBS snapshot for {{ $labels.vm_name }} is not verified successfully"
21+
description: >-
22+
The latest snapshot for {{ $labels.vm_name }} on
23+
{{ $labels.node_name }} is not verified successfully.
2224
23-
- alert: PBS - Sync Failed
24-
expr: pbs_task_status{task_type="sync",status=~"(?i:failed|error)"} == 1
25+
- alert: PBS - Local Backup Stale
26+
expr: >-
27+
(time() - pbs_snapshot_vm_last_timestamp > 172800)
28+
and on (site_slug, namespace)
29+
label_replace(
30+
count by (site_slug) (pbs_snapshot_vm_last_timestamp),
31+
"namespace", "$1", "site_slug", "(.+)"
32+
)
2533
for: 10m
2634
labels:
2735
severity: critical
2836
annotations:
29-
summary: "PBS sync failed on {{ $labels.node_name }}"
30-
description: "Sync {{ $labels.task }} for datastore {{ $labels.datastore }} failed."
37+
summary: "PBS backup for {{ $labels.vm_name }} is older than two days"
38+
description: >-
39+
The latest local snapshot for {{ $labels.vm_name }} on
40+
{{ $labels.node_name }} is older than two days.
41+
42+
- alert: PBS - Sync Backup Stale
43+
expr: >-
44+
(time() - pbs_snapshot_vm_last_timestamp > 172800)
45+
unless on (site_slug, namespace)
46+
label_replace(
47+
count by (site_slug) (pbs_snapshot_vm_last_timestamp),
48+
"namespace", "$1", "site_slug", "(.+)"
49+
)
50+
for: 10m
51+
labels:
52+
severity: critical
53+
annotations:
54+
summary: "PBS sync for {{ $labels.vm_name }} is older than two days"
55+
description: >-
56+
The latest remote snapshot for {{ $labels.vm_name }} on
57+
{{ $labels.node_name }} is older than two days.
58+
59+
- alert: PBS - Sync Missing
60+
expr: >-
61+
count by (site_slug, node_name, instance) (pbs_snapshot_vm_last_timestamp)
62+
unless on (site_slug, node_name, instance)
63+
count by (site_slug, node_name, instance) (
64+
pbs_snapshot_vm_last_timestamp
65+
unless on (site_slug, namespace)
66+
label_replace(
67+
count by (site_slug) (pbs_snapshot_vm_last_timestamp),
68+
"namespace", "$1", "site_slug", "(.+)"
69+
)
70+
)
71+
for: 10m
72+
labels:
73+
severity: critical
74+
annotations:
75+
summary: "PBS has no remote snapshots"
76+
description: >-
77+
PBS {{ $labels.node_name }} has local snapshots but no snapshots in
78+
a remote namespace.

playbooks/host_files/beokpdcovm01/templates/prometheus/prometheus.yml.j2

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,25 +264,33 @@ scrape_configs:
264264

265265
{% if prometheus.features.pbs_exporter | default(false) %}
266266
- job_name: 'pbs_exporter'
267-
metrics_path: /probe
267+
metrics_path: /metrics
268268
http_sd_configs:
269269
- <<: *netbox_auth
270270
url: https://netbox.unitix.be/api/plugins/prometheus-sd/virtual-machines/?status=active&tag=pbs
271271
relabel_configs:
272-
- source_labels: [__meta_netbox_name]
272+
- source_labels: [__meta_netbox_primary_ip]
273+
regex: '([0-9.]+)'
274+
replacement: 'https://$1:8007'
275+
target_label: __param_target
276+
- source_labels: [__meta_netbox_primary_ip]
277+
regex: '([0-9a-fA-F:]*:[0-9a-fA-F:]+)'
278+
replacement: 'https://[$1]:8007'
273279
target_label: __param_target
274280
- source_labels: [__meta_netbox_primary_ip]
275281
target_label: instance
276282
- source_labels: [__meta_netbox_name]
277283
target_label: node_name
278284
- source_labels: [__meta_netbox_site]
279285
target_label: site
286+
- source_labels: [__meta_netbox_site_slug]
287+
target_label: site_slug
280288
- source_labels: [__meta_netbox_tenant]
281289
target_label: tenant
282290
- source_labels: [__meta_netbox_role_slug]
283291
target_label: device_role
284292
- target_label: __address__
285-
replacement: "prometheus-pbs_exporter:9569"
293+
replacement: "prometheus-pbs_exporter:10019"
286294

287295
{% endif %}
288296

playbooks/host_vars/beokpdcort01.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,15 @@ firewall:
106106
ip: "@MONITORING"
107107
destination:
108108
protocol: tcp
109-
port: "{ 80,443,9090,9100,9323,9342 }" # http,https,federate,node_exporter,docker_exporter,frr_exporter
109+
port: "{ 80,443,8007,9090,9100,9323,9342 }" # http,https,pbs,federate,node_exporter,docker_exporter,frr_exporter
110110
counter: true
111111
- comment: "Allow from MONITORING"
112112
type: ip6
113113
source:
114114
ip: "@v6_MONITORING"
115115
destination:
116116
protocol: tcp
117-
port: "{ 80,443,9090,9100,9323,9342 }" # http,https,node_exporter,docker_exporter,frr_exporter
117+
port: "{ 80,443,8007,9090,9100,9323,9342 }" # http,https,pbs,node_exporter,docker_exporter,frr_exporter
118118
counter: true
119119
# DNS
120120
- comment: "Allow Adguard to Recursive"

playbooks/host_vars/beokpdcovm01.yml

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,86 @@ dawarich_photon_api_host: photon.frai.se
33
dawarich_photon_api_port: "443"
44
dawarich_photon_api_use_https: "true"
55

6+
adguard_hostname: dns1.frai.se
7+
8+
docker:
9+
dir:
10+
config: /data/docker-config
11+
data: /data/docker
12+
networks:
13+
monitoring:
14+
driver_options:
15+
parent: ens19.1001
16+
hosts:
17+
loki: 94
18+
ipam:
19+
- gateway: 10.10.48.65
20+
subnet: 10.10.48.64/27
21+
- gateway: 2001:678:1080:1001::1
22+
subnet: 2001:678:1080:1001::/64
23+
ipv6: true
24+
type: ipvlan
25+
networking:
26+
driver_options:
27+
parent: ens19.1004
28+
hosts:
29+
uisp: 189
30+
unifi: 190
31+
ipam:
32+
- gateway: 10.10.48.161
33+
subnet: 10.10.48.160/27
34+
- gateway: 2001:678:1080:1004::1
35+
subnet: 2001:678:1080:1004::/64
36+
ipv6: true
37+
type: ipvlan
38+
services:
39+
driver_options:
40+
parent: ens19.1002
41+
hosts:
42+
adguard: 124
43+
traefik: 125
44+
unbound: 123
45+
ipam:
46+
- gateway: 10.10.48.97
47+
subnet: 10.10.48.96/27
48+
- gateway: 2001:678:1080:1102::1
49+
subnet: 2001:678:1080:1102::/64
50+
ipv6: true
51+
type: ipvlan
52+
users:
53+
- fraise
54+
55+
mounts:
56+
- fs: ext4
57+
mountpoint: /data/
58+
source: /dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2
59+
60+
netbox_interface: true
61+
62+
portainer:
63+
network: services
64+
type: portainer-ce
65+
666
prometheus:
767
features:
68+
adguard: true
69+
alertmanager: true
70+
blackbox: true
71+
graphite: true
72+
ipmi: true
73+
snmp: true
74+
speedtest: true
875
pbs_exporter: true
976

10-
# Each target is keyed by the PBS VM's NetBox name. The target must be the
11-
# endpoint accepted by the PBS exporter; token secrets belong in Vault.
12-
# pbs_exporter_targets:
13-
# - netbox_name: pbs.example
14-
# target: https://pbs.example:8007
15-
# api_token_id: prometheus@pbs!exporter
16-
# api_token_secret: !vault |
17-
# $ANSIBLE_VAULT;1.1;AES256
77+
# Shared secret for the prometheus@pbs!exporter token configured on every PBS.
78+
pbs_exporter_api_token: !vault |
79+
$ANSIBLE_VAULT;1.1;AES256
80+
66653733653366643937326266313733396333356535656563306634613739333964316434303736
81+
3530373137643934333034373738366631353838666663660a326662613839346663383832626538
82+
39613466356665323864376164323835396661666137313039396436373736386331306362363137
83+
3233313231613636330a613430353262356234386366346534386462376362636136316130306238
84+
31386434316431383361613835323464626661313530383834306231623764393032313932343938
85+
3934663937333435663532346261663261643038343063303030
1886
1987
cloudflared:
2088
docker_network: services
Lines changed: 12 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,29 @@
11
---
2-
- name: Validate PBS exporter targets list
2+
- name: Validate PBS exporter API token
33
ansible.builtin.assert:
44
that:
5-
- pbs_exporter_targets is defined
6-
- pbs_exporter_targets is sequence
7-
- pbs_exporter_targets is not string
8-
- pbs_exporter_targets | length > 0
9-
fail_msg: pbs_exporter_targets must be a non-empty inventory list.
10-
no_log: true
11-
12-
- name: Validate PBS exporter targets
13-
ansible.builtin.assert:
14-
that:
15-
- item.netbox_name is defined
16-
- item.netbox_name is string
17-
- item.netbox_name | length > 0
18-
- item.target is defined
19-
- item.target is string
20-
- item.target | length > 0
21-
- item.api_token_id is defined
22-
- item.api_token_id is string
23-
- item.api_token_id | length > 0
24-
- item.api_token_secret is defined
25-
- item.api_token_secret is string
26-
- item.api_token_secret | length > 0
27-
fail_msg: >-
28-
Every PBS exporter target must define netbox_name, target, api_token_id,
29-
and api_token_secret.
30-
loop: "{{ pbs_exporter_targets }}"
31-
loop_control:
32-
label: hidden
33-
no_log: true
34-
35-
- name: Validate unique PBS exporter target selectors
36-
ansible.builtin.assert:
37-
that:
38-
- >-
39-
pbs_exporter_targets | map(attribute='netbox_name') | unique | list | length
40-
== pbs_exporter_targets | length
41-
- >-
42-
pbs_exporter_targets | map(attribute='target') | unique | list | length
43-
== pbs_exporter_targets | length
44-
fail_msg: PBS exporter NetBox names and targets must be unique.
45-
no_log: true
46-
47-
- name: Create PBS exporter config directory
48-
ansible.builtin.file:
49-
path: "{{ docker.dir.config }}/prometheus_pbs_exporter"
50-
state: directory
51-
owner: root
52-
group: root
53-
mode: "0700"
54-
no_log: true
55-
56-
- name: Render PBS exporter targets
57-
ansible.builtin.template:
58-
src: pbs_targets.yml.j2
59-
dest: "{{ docker.dir.config }}/prometheus_pbs_exporter/targets.yml"
60-
owner: root
61-
group: root
62-
mode: "0600"
63-
no_log: true
64-
65-
- name: Remove legacy per-target PBS exporters
66-
community.docker.docker_container:
67-
name: "prometheus-pbs-exporter-{{ item.name }}"
68-
state: absent
69-
loop: "{{ pbs_exporter_instances | default([]) }}"
70-
loop_control:
71-
label: hidden
5+
- pbs_exporter_api_token is defined
6+
- pbs_exporter_api_token is string
7+
- pbs_exporter_api_token | length > 0
8+
fail_msg: pbs_exporter_api_token must be supplied as an inventory variable.
729
no_log: true
7310

7411
- name: Setup Prometheus PBS exporter
7512
community.docker.docker_container:
7613
name: prometheus-pbs_exporter
77-
image: "{{ pbs_exporter_image | default('natrontech/pbs-exporter:latest') }}"
14+
image: ghcr.io/natrontech/pbs-exporter:latest
15+
user: "65534:65534"
7816
networks:
7917
- name: monitoring
8018
dns_servers: "{{ dns.servers }}"
81-
volumes:
82-
- "{{ docker.dir.config }}/prometheus_pbs_exporter/targets.yml:/config/targets.yml:ro"
83-
command: "--config.file=/config/targets.yml"
19+
env:
20+
PBS_USERNAME: pbs_exporter@pbs
21+
PBS_API_TOKEN_NAME: pbs_exporter_token
22+
PBS_API_TOKEN: "{{ pbs_exporter_api_token }}"
23+
PBS_INSECURE: "true"
8424
restart: true
8525
restart_policy: always
8626
state: started
8727
pull: true
8828
labels:
8929
traefik.enable: "false"
90-
com.unitix.prometheus.pbs-exporter: "true"
91-
no_log: true

roles/prometheus/templates/pbs_targets.yml.j2

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)