Episode ini mengawasi sistem backup: integrasi Prometheus lewat pgbackrest_exporter, parsing pgbackrest info --output=json di script, serta alerting untuk backup yang gagal, terlambat melewati deadline, dan WAL archiving yang stuck. Sistem backup yang tidak terpantau adalah sistem yang gagal diam-diam.

Backup yang berjalan lancar tidak pernah menyita perhatian. Masalahnya: sistem backup gagal tanpa suara — jadwal terlewat, WAL berhenti diarsipkan, repository penuh — dan tidak ada yang tahu sampai data benar-benar dibutuhkan untuk di-restore. Di episode 14 kita memasang mata dan telinga: monitoring dengan Prometheus dan alerting yang berteriak sebelum bencana menjadi fatal.
Ini prinsip yang mengubah segalanya: backup bukan "tugas yang dijalankan", melainkan SLA yang diukur. Jika kalian tidak memantau umur backup terakhir, kalian tidak tahu apakah jaminan recovery itu nyata.
Sebelum alat monitoring, pgBackRest sudah menyediakan output terstruktur untuk script: --output=json. Coba sendiri:
sudo -u postgres pgbackrest info --output=jsonOutputnya berisi per stanza: status, umur backup terakhir (backup/timestamp-stop), tipe, dan rentang WAL. Dari sini script bisa mengekstrak metrik penting:
sudo -u postgres pgbackrest info --output=json | \
node -e 'const d=JSON.parse(require("fs").readFileSync(0));const b=d[0].backup[0];console.log("last backup age (s):", Math.round((Date.now()/1000 - b.timestamp.stop)*100)/100)'Pola ini adalah dasar dari setiap script "is backup fresh?" — dan bisa dijalankan dari cron untuk alert sederhana tanpa Prometheus (kita bahas di bagian alerting).
pgbackrest_exporter adalah exporter yang menerjemahkan output pgBackRest menjadi metrik Prometheus yang siap di-scrape. Install dan jalankan di host database:
# unduh binary dari release project pgbackrest_exporter
./pgbackrest_exporter --pgbackrest.executable=/usr/bin/pgbackrest \
--web.listen-address=:9854Exporter membaca pgbackrest info secara periodik dan mengekspos metrik di /metrics, contohnya:
pgbackrest_info_backup_timestamp_stop — kapan backup terakhir selesai.pgbackrest_info_backup_size — ukuran backup.pgbackrest_info_backup_type — tipe backup (full/diff/incr).scrape_configs:
- job_name: pgbackrest
static_configs:
- targets: ["db01.internal:9854"]Dengan metrik timestamp stop di Prometheus, kalian bisa menghitung umur backup sebagai metrik turunan:
time() - pgbackrest_info_backup_timestamp_stopTip
Pasang exporter per host database dan scrape dalam satu job — dashboard akan menampilkan umur backup semua instance sekaligus. Satu panel "backup terlambat" di Grafana biasanya menyelamatkan lebih banyak malam minggu daripada semua runbook digabung.
Dua kondisi yang harus selalu dialert:
Dengan cron sederhana, cek umur backup tiap jam:
5 * * * * /usr/local/bin/pgbackrest_age_check.sh main 26Script-nya membaca JSON dan membandingkan umur backup terakhir dengan ambang (misal 26 jam untuk jadwal full+diff harian):
#!/usr/bin/env bash
set -euo pipefail
stanza=$1
max_age_hours=$2
age_s=$(pgbackrest info --output=json --stanza="$stanza" \
| node -e 'const d=JSON.parse(require("fs").readFileSync(0));console.log(Math.round((Date.now()/1000-d[0].backup[0].timestamp.stop)*100)/100)')
age_h=$(awk -v s="$age_s" 'BEGIN{printf "%.2f", s/3600}')
if awk -v a="$age_h" -v m="$max_age_hours" 'BEGIN{exit !(a>m)}'; then
echo "ALERT: backup stanza $stanza terlambat ($age_h jam > $max_age_hours jam)"
exit 1
fiDi Prometheus, alert yang setara:
groups:
- name: pgbackrest.rules
rules:
- alert: PgBackRestBackupTooOld
expr: (time() - pgbackrest_info_backup_timestamp_stop) / 3600 > 26
for: 30m
annotations:
summary: "Backup terlambat {{ $labels.stanza }}"WAL yang berhenti diarsipkan berarti data yang belum di-backup menumpuk di primary. Dua sinyal:
pg_stat_archiver menampilkan failed_count naik.pgbackrest info menunjukkan wal archive min/max statis.Script cek sederhana:
psql -U postgres -tAc "SELECT failed_count FROM pg_stat_archiver;"Setiap kenaikan failed_count harus langsung dialert. Di Prometheus, pg_stat_archiver juga bisa diekspos oleh postgres_exporter untuk alert yang sama.
Warning
Jangan menunggu sampai restore gagal untuk mengetahui WAL stuck. WAL yang tidak terarsipkan membuat PITR meleset — database bisa di-restore, tetapi hanya sampai backup terakhir, bukan ke waktu yang kalian butuhkan. Alert failed_count adalah garis pertahanan pertama.
Repository penuh adalah penyebab klasik archive-push gagal. Pantau kapasitas disk repository:
df -h /var/lib/pgbackrestAlert saat penggunaan di atas 80-85% — karena saat penuh, backup dan WAL berhenti, dan alarmnya baru muncul dari jalur yang berbeda (backup terlambat).
Metrik yang paling berguna untuk dashboard:
Inti yang harus dibawa pulang:
pgbackrest info --output=json adalah bahan baku semua script monitoring.pgbackrest_exporter menerjemahkannya ke metrik Prometheus yang di-scrape.Di episode 15 selanjutnya kita akan memecahkan masalah saat semuanya tidak berjalan: troubleshooting & debug — menaikkan --log-level-console=debug dan --log-level-file=debug, membaca /var/log/pgbackrest/, serta menangani kasus paling umum: archive-push gagal, permission denied, repository penuh, dan version mismatch. Debugging yang terstruktur adalah keahlian yang menyelamatkan produksi!