Zum Inhalt springen
use-cases / heartbeat-for-silent-jobs / hero
CRON · NOTIFICATIONS · STILLE-ALARM

Ein Heartbeat für die stillen Jobs

Das meiste Monitoring beobachtet, was passiert ist. Du brauchtest etwas, das beobachtet, was nicht passiert ist. Zwei Cron-Einträge — einer schlägt, einer hört auf das Ausbleiben des Schlags — und die Page, die dich am Strand erreicht.

Cron-Docs lesen
use-cases / heartbeat-for-silent-jobs / mechanism

Zwei Cron-Einträge. Einer sagt, ich lebe. Der andere hört auf nichts.

Der Job, den du schon hattest, macht weiter seine Arbeit. Wenn er fertig ist, fügt er ein curl hinzu: eine Heartbeat-Zeile an einen Notifications-Endpoint. Ein zweiter Cron-Eintrag läuft in seiner eigenen Kadenz und prüft auf Stille — wenn kein frischer Beat da ist, alarmiert er dein Handy. Der Erfolg des Jobs ist still. Sein Ausbleiben ist laut.

worker.cron · der Job
POST · heartbeat
schedule0 2 * * *
# Wenn der nächtliche Export fertig ist,# pingt der Job seinen eigenen Heartbeat.0 2 * * * /usr/local/bin/export.sh \ && curl -fsS -X POST \ https://notify.containers.hoody.com/heartbeats/backup-prod-db
das Ausbleiben ist das Signal
watcher.cron · der Listener
GET · silence-check
schedule*/15 * * * *
# Alle 15 Minuten fragen: gab es einen Beat?# Wenn länger als 1h still, alarmiert die API alle Kanäle.*/15 * * * * curl -fsS \ https://notify.containers.hoody.com/silence-check?\ job=backup-prod-db&max_age=1h

Zwei POSTs an /users/root/entries mit Fünf-Feld-Expressions. Der erste läuft nach jedem geplanten Job und postet seinen Heartbeat. Der zweite läuft in eigener Kadenz, fragt den Notifications-Endpoint, ob der letzte Beat frisch genug ist, und löst die Page aus, wenn nicht. Keine Queue, kein Agent, kein Daemon — nur zwei Crontab-Zeilen, die ohnehin existieren mussten.

use-cases / heartbeat-for-silent-jobs / powers

Warum das Beobachten von Abwesenheit anders ist

Die meisten Monitoring-Tools beobachten den Erfolgspfad: sie alarmieren, wenn etwas passiert. Diese Form alarmiert, wenn nichts passiert — und das ist der Fall, den die stillen Jobs immer verlieren.

FAILURE MODES

Fängt den stillen Crash

Wenn der Worker-Prozess nie startet — die Box hat rebootet, das Skript wurde gelöscht, ein Quota lief ab — gibt es nichts zu loggen und nichts, worauf alarmiert werden könnte. Der Watcher-Cron läuft trotzdem und merkt, dass die Heartbeat-Zeile abgestanden ist. Das, was den stillen Crash fängt, ist genau das, was nicht von der stillen Sache abhängt.

ZERO SURFACE

Kein neuer Service zum Babysitten

Der Monitor ist eine zusätzliche Crontab-Zeile, kein Healthchecks.io-Account und kein CloudWatch-Alarm. Er ist an denselben Container wie die Arbeit gebunden, läuft mit `expires_at` ab, wenn du das willst, und liest aus derselben Notifications-API, die der Rest deines Stacks ohnehin nutzt.

REACHES YOU

Laut, wenn es zählt

Der Notifications-Endpoint fan-outet die Page über Push, SMS und Email — die Kanäle, denen du ohnehin vertraust. Du beobachtest das Dashboard nicht. Das Dashboard beobachtet sich selbst und findet dich nur am Strand auf Bali, wenn die Stille zu lange angedauert hat.

use-cases / heartbeat-for-silent-jobs / capacity

Echtes Cron, echte Notifications

Der Mechanismus ist schlichtes Hoody Cron und Hoody Notifications. Die Zahlen kommen aus der dokumentierten API-Surface, nicht aus einer Demo-Runtime.

  1. GESAMTE CRON-SYNTAX@daily

    Standard 5-Feld-Expressions plus Macros — `@hourly`, `@daily`, `@weekly`, `@monthly`, `@yearly`. Watcher und Worker können komplett unterschiedliche Kadenzen haben.

  2. AUTO-ABLAUFexpires_at

    Managed Entries unterstützen `expires_at`, sodass ein temporärer Heartbeat (z.B. ein einwöchiges Migrationsfenster) sich selbst aufräumt. Der Watcher verschwindet mit der Arbeit.

  3. ISOLATIONper-user

    Jeder Container bekommt seine eigene Crontab. Der Heartbeat eines Tenants kann den Watcher eines anderen nicht stummschalten, und einen Job zu deaktivieren ist ein einzelnes PATCH `enabled: false`.

Limits gemäß Hoody Cron API: 5-Feld-Expressions plus die Macros `@hourly`/`@daily`/`@weekly`/`@monthly`/`@yearly`, optionales `expires_at` auf Managed Entries, Per-User-Crontab-Isolation, Aktivieren/Deaktivieren via PATCH.

use-cases / heartbeat-for-silent-jobs / punchline

Stille ist jetzt ein Alarm.

VORHER · DAS LOG BEOBACHTENDashboard öffnen · letzten Export suchen · seufzen · vergessendu bemerkst den fehlenden Job erst am Montag
NACHHER · DIE STILLE BEOBACHTEN*/15 * * * * curl /silence-check?job=backup-prod-dbdie Page erreicht dich, während die Stille noch klein ist
Cron-Docs lesen
use-cases / heartbeat-for-silent-jobs / replaces

Was das ersetzt

Die Standard-Greift-Tools, wenn du einen Cron-Monitor mit Paging willst. Jedes davon ist ein eigener Account, eine eigene Rechnung, eine eigene API. Zwei Crontab-Zeilen und der Notifications-Endpoint machen denselben Job.

  • Custom-OrchestratorenGanze Orchestrierungs-Services für das, was zwei Crontab-Zeilen sind
  • Healthchecks.ioEin SaaS-Account nur, um einen HTTP-Heartbeat zu empfangen
  • CronitorPro-Monitor-Pricing für etwas, das dein Container ohnehin tut
  • Dead Man's SnitchGenau dieses Pattern, als Subscription verkauft
  • AWS CloudWatch Alarms für CronLambda + Alarms + IAM-Policies für eine abgestandene Zeile
  • Custom Heartbeat-Collection-SkripteEin Microservice, um einen Wert zu loggen, den der Cron einfach POSTen könnte
use-cases / heartbeat-for-silent-jobs / cta

Hör auf, den Erfolgspfad zu beobachten. Beobachte die Abwesenheit von Erfolg — das ist der einzige Ort, an dem die stillen Failures leben.

Cron-Docs lesen
use-cases / heartbeat-for-silent-jobs / related

Lies die anderen