← Späť na blog
2023-11-14 · 6 min

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:

  1. V monitoring službe vytvoríte heartbeat monitor s očakávaným intervalom (napr. "každých 60 minút").
  2. Dostanete unikátnu heartbeat URL: https://epulz.io/heartbeat/abc123xyz.
  3. Vo svojom cron jobe na konci úspešného behu zavoláte tento URL (HTTP GET alebo POST).
  4. 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.

Tip: Pre dôkladnejšie pokrytie pridajte aj "start" heartbeat:
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 →