Job yang tidak pernah berjalan adalah yang paling berbahaya — dan paling sulit dideteksi. Episode ini mengekspor durasi dan status ke Prometheus lewat node_exporter textfile, mendeteksi job yang hilang dengan alerting on miss, serta mengaudit perubahan crontab dan melakukan review berkala.

Di episode 19 kita mengelola scheduling terdistribusi. Kini kita jawab pertanyaan yang mengganggu: bagaimana mengetahui job tidak berjalan — sebelum terlambat?
Di episode 12 kita membangun alert saat job gagal (exit code != 0). Tetapi ada kegagalan yang lebih licik: job yang tidak pernah muncul sama sekali — host mati, crontab terhapus, jadwal terlewat karena DST, atau kontroler cluster bermasalah. Tidak ada exit code, tidak ada email, tidak ada apa-apa. Deteksi jenis kegagalan ini butuh observability dan audit.
Pola paling sederhana untuk metrik job dari host: textfile collector node_exporter. Script job menulis metrik ke file .prom, dan node_exporter membacanya saat di-scrape.
#!/bin/bash
set -uo pipefail
DIR=/var/lib/node_exporter/textfile
START=$(date +%s)
STATUS=0
if /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1; then
STATUS=1
else
STATUS=0
fi
END=$(date +%s)
printf '# HELP cron_backup_success 1 jika backup sukses\n' > "$DIR/backup.prom"
printf '# TYPE cron_backup_success gauge\n' >> "$DIR/backup.prom"
printf 'cron_backup_success 1\n' >> "$DIR/backup.prom" # status 1
printf '# TYPE cron_backup_duration_seconds gauge\n' >> "$DIR/backup.prom"
printf 'cron_backup_duration_seconds %d\n' "$((END - START))" >> "$DIR/backup.prom"Metrik yang dihasilkan:
# TYPE cron_backup_success gauge
cron_backup_success 1
# TYPE cron_backup_duration_seconds gauge
cron_backup_duration_seconds 42Note
Untuk host dengan beberapa job, jangan menulis file .prom terpisah per job tanpa konvensi nama yang rapi — node_exporter membaca semua file .prom di direktori. Beri nama sesuai job (backup.prom, cleanup.prom) dan pastikan permission direktori bisa ditulis user yang menjalankan job.
Metrik cron_backup_success hanya ada jika job selesai menulisnya. Jika job tidak pernah berjalan, metrik tidak diperbarui — dan di sinilah kekuatan alert on miss:
groups:
- name: cronjob
rules:
- alert: CronJobMissed
expr: time() - cron_backup_success > 90000
annotations:
summary: Backup tidak muncul selama 25 jam - alert: CronJobMissing
expr: absent(cron_backup_success)
for: 24h
annotations:
summary: Metrik backup hilang — job mungkin tidak pernah jalanPerbedaan penting: alert on failure (episode 12) menangkap job yang gagal; alert on miss menangkap job yang tak pernah dimulai. Keduanya dibutuhkan.
kubectl get cronjobs -A -o wide
kubectl get jobs -ASiapkan juga Blackbox/Probe untuk layanan yang seharusnya diperbarui job — misal file versi di HTTP endpoint yang diperbarui backup berkala; jika isinya basi, ada masalah.
Dari episode 5, /var/log/cron mencatat setiap eksekusi. Tambahkan audit di level user:
sudo auditctl -w /var/spool/cron/ -p wa -k cron-change
sudo ausearch -k cron-change --start todayIni menjawab pertanyaan "siapa yang mengubah crontab dan kapan" — penting saat jadwal berubah tanpa sepengetahuan tim.
Observability tanpa proses adalah data yang menganggur. Terapkan ritual:
crontab -l per user) — apakah semua job masih dibutuhkan?crontab file + PR, dari episode 4).for u in $(cut -d: -f1 /etc/passwd); do
sudo crontab -l -u "$u" 2>/dev/null && echo "--- $u ---"
doneTip
Satu metrik observability + satu alert on miss per job kritis, ditambah audit perubahan — itu fondasi yang cukup untuk job production. Mulai dari job paling kritis (backup, restore, payment), bukan semua job sekaligus.
| Lapisan | Menangkap | Alat |
|---|---|---|
| Alert on failure | Job jalan tapi gagal | Exit code + webhook (ep. 12) |
| Metrik textfile | Durasi, status | node_exporter + Prometheus |
| Alert on miss | Job tak pernah muncul | absent() / staleness |
| Audit log | Perubahan crontab | auditd + /var/log/cron |
| Review berkala | Job usang/tanpa pemilik | Ritual bulanan |
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita akan membahas roadmap dan community — kemana arah cronie ke depan, tren migrasi ke systemd timer dan K8s CronJob, serta ekosistem sumber belajar: crontab.guru, man 5 crontab, dan dokumentasi distro!