Zpět na blog

Monitoring cron jobů a background workerů přes heartbeat

· 6 min čtení

Ve zkratce: Klasický HTTP monitoring nezjistí, že vám padl noční cron, který odesílá faktury nebo synchronizuje data. Heartbeat pattern obrátí směr komunikace - cron se hlásí monitoringu, a pokud v očekávaném čase nezavolá, dostanete alert.

Ve zkratce: Klasický HTTP monitoring nezjistí, že vám padl noční cron, který odesílá faktury nebo synchronizuje data. Heartbeat pattern obrátí směr komunikace - cron se hlásí monitoringu, a pokud v očekávaném čase nezavolá, dostanete alert.

Problém: background úlohy bez HTTP endpointu

Typický backend má cesty:

  • Webové requesty (HTTP/HTTPS na server) - monitorujete uptime checkem.
  • Cron joby (denní backup, měsíční fakturace, hodinová synchronizace) - nemají HTTP endpoint, externí monitoring je nevidí.
  • Workers (Celery, BullMQ, Sidekiq) konzumující frontu - také bez HTTP.

Pokud cron padne (změníte crontab a uděláte překlep, server nemá disk, environment variable chybí, dependency upgrade rozbil import), nikdo vás neupozorní - dokud si v pondělí ráno nevšimnete, že faktury se neodeslaly za víkend.

Heartbeat pattern: cron pinguje monitoring

Princip je obrácený oproti normálnímu monitoringu:

  1. V monitoring službě vytvoříte heartbeat monitor s očekávaným intervalem (např. "každých 60 minut").
  2. Dostanete unikátní heartbeat URL: https://epulz.io/heartbeat/abc123xyz.
  3. Ve svém cron jobu na konci úspěšného běhu zavoláte tento URL (HTTP GET nebo POST).
  4. Pokud ping nepřijde v očekávaném čase (+ grace perioda), monitoring vás upozorní.

Praktický pří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

Klíčový je && - heartbeat se pošle jen pokud backup.sh skončí s exit kódem 0. Pokud skript selže, ping nepřijde, a vy do hodiny dostanete alert.

Tip: Pro důkladnější pokrytí přidejte i "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 pak rozliší "začal a nedokončil" (skript zamrzl) od "vůbec nezačal" (cron job se nespustil).

Python: requests + try/except

import os, requests
HEARTBEAT_URL = os.environ["HEARTBEAT_URL"]

def sync_data():
    # vaše logika
    pass

try:
    sync_data()
    requests.get(HEARTBEAT_URL, timeout=10)
except Exception as e:
    # Heartbeat se 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: kolik času dát před alertem

Heartbeat monitor potřebuje toleranci - cron běží občas déle než obvykle, síť má latenci, NTP synchronizace může být mírně posunutá. Grace period je čas po očekávaném intervalu, během kterého ještě monitoring čeká.

Praktické hodnoty:

  • Hourly cron: interval 60 min + grace 10 min
  • Daily backup (průměrně 20 min): interval 1440 min + grace 60 min
  • Weekly report: interval 10080 min + grace 360 min (6 h)

Příliš těsný grace = false-positive alerty. Příliš volný = opožděné upozornění, když reálně padne.

Kde heartbeat pattern nejvíce pomáhá

  • Noční DB backupy
  • Synchronizace s externími API (CRM, accounting, payment)
  • Kalkulace reportů
  • Cleanup úlohy (mazání starých session, logů, dočasných souborů)
  • Healthcheck cyklus dlouhoběžících workerů
  • Naplánované emaily, newslettery, fakturace

Závěr

Background úlohy jsou často kritičtější než samotný web, ale zůstávají slepou skvrnou monitoringu. Heartbeat pattern vyžaduje 5 minut implementace (přidání curl na konec cron řádku) a poskytuje stejný klid v duši jako uptime monitoring pro frontend.

Začněte monitorovat cron joby

ePulz.io podporuje heartbeat checky s konfigurovatelnou grace periodou. 7 dní zdarma.

Spustit monitoring →


Vyzkoušejte ePulz.io zdarma - 7 dní bez kreditní karty.

Vytvořit účet