Monitoring cron jobov: heartbeat pattern v praxi
V skratke: Klasický HTTP monitoring nezistí, že vám padol nočný cron, ktorý odosiela faktúry alebo synchronizuje dáta. Heartbeat pattern obráti smer komunikácie - cron sa hlási monitoringu, a ak v očakávanom čase nezavolá, dostanete alert.
Problém: background úlohy bez HTTP endpointu
Typický backend má cesty:
- Webové requesty (HTTP/HTTPS na server) - monitorujete uptime check-om.
- Cron joby (denný backup, mesačná fakturácia, hodinová synchronizácia) - nemajú HTTP endpoint, externý monitoring ich nevidí.
- Workers (Celery, BullMQ, Sidekiq) konzumujúci frontu - tiež bez HTTP.
Ak cron padne (zmeniete crontab a urobíte preklep, server nemá disk, environment variable chýba, dependency upgrade rozbil import), nikto vás neupozorní - kým si v pondelok ráno nevšimnete, že faktúry sa neodoslali za víkend.
Heartbeat pattern: cron pinguje monitoring
Princíp je obrátený oproti normálnemu monitoringu:
- V monitoring službe vytvoríte heartbeat monitor s očakávaným intervalom (napr. "každých 60 minút").
- Dostanete unikátnu heartbeat URL:
https://epulz.io/heartbeat/abc123xyz. - Vo svojom cron jobe na konci úspešného behu zavoláte tento URL (HTTP GET alebo POST).
- Ak ping nepríde v očakávanom čase (+ grace perióda), monitoring vás upozorní.
Praktický príklad: bash cron
# /etc/crontab
0 3 * * * www-data /usr/local/bin/backup.sh && curl -fsS -m 10 \
https://epulz.io/heartbeat/abc123xyz > /dev/null
Kľúčový je && - heartbeat sa pošle iba ak backup.sh skončí s exit kódom 0. Ak skript zlyhá, ping nepríde, a vy do hodiny dostanete alert.
curl -fsS -m 10 https://epulz.io/heartbeat/abc123xyz/start > /dev/null
/usr/local/bin/backup.sh
EXIT=$?
curl -fsS -m 10 "https://epulz.io/heartbeat/abc123xyz?exit=$EXIT" > /dev/null
Monitoring potom rozlíši "začal a nedokončil" (skript zamrzol) od "vôbec nezačal" (cron job sa nespustil).
Python: requests + try/except
import os, requests
HEARTBEAT_URL = os.environ["HEARTBEAT_URL"]
def sync_data():
# ... your logic ...
pass
try:
sync_data()
requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
# Heartbeat sa nepošle - monitoring vás upozorní
raise
Node.js: async / await
const HEARTBEAT_URL = process.env.HEARTBEAT_URL;
async function nightlyJob() {
await processInvoices();
await fetch(HEARTBEAT_URL, { signal: AbortSignal.timeout(10000) });
}
nightlyJob().catch(err => {
console.error(err);
process.exit(1);
});
Grace period: koľko času dať pred alertom
Heartbeat monitor potrebuje toleranciu - cron beží občas dlhšie ako obvykle, sieť má latenciu, NTP synchronizácia môže byť mierne posunutá. Grace period je čas po očakávanom intervale, počas ktorého ešte monitoring čaká.
Praktické hodnoty:
- Hourly cron: interval 60 min + grace 10 min
- Daily backup (priemerne 20 min): interval 1440 min + grace 60 min
- Weekly report: interval 10080 min + grace 360 min (6 h)
Príliš tesný grace = false-positive alerty. Príliš voľný = oneskorené upozornenie, keď reálne padne.
Kde heartbeat pattern najviac pomáha
- Nočné DB backups
- Synchronizácia s externými API (CRM, accounting, payment)
- Kalkulácie reportov
- Cleanup úlohy (mazanie starých session, logov, dočasných súborov)
- Healthcheck cyklus dlhobežiacich workerov
- Scheduled emaily, newslettre, fakturácia
Záver
Background úlohy sú často kritickejšie ako samotný web, no zostávajú slepou škvrnou monitoringu. Heartbeat pattern vyžaduje 5 minút implementácie (pridanie curl na koniec cron riadku) a poskytuje rovnaký pokoj v duši ako uptime monitoring pre frontend.
Začnite monitorovať cron joby
ePulzio podporuje heartbeat checks s konfigurovateľnou grace periódou. 7 dní zdarma.
Spustiť monitoring →