Cron Monitoring und Alerting in Magento 2: cron_schedule ueberwachen statt hoffen
AI generated
M2
di.xml
Magento 2 · Cron · Monitoring · Alerting
Cron Monitoring und Alerting in Magento 2
cron_schedule ueberwachen statt auf stille Ausfaelle zu hoffen

Ein Cron Job, der seit drei Tagen nicht mehr laeuft, faellt im Frontend meist nicht sofort auf, richtet aber genau in dieser Zeit stillen Schaden an. Systematisches Cron Monitoring und Alerting macht ausgebliebene und fehlgeschlagene Jobs sichtbar, bevor Kunden oder Umsatz darunter leiden.

18 Min. Lesezeit cron_schedule · Health Check · Alerting Magento 2.4.x

1. Warum Cron Ausfaelle so lange unbemerkt bleiben

Ein ausgebliebener Cron Job zeigt sich selten sofort im Frontend. Bestellbestaetigungs Mails werden weiterhin verschickt, die Website laedt weiterhin, nur ein einzelner Hintergrundprozess, etwa ein Datenexport oder eine Preissynchronisation, laeuft schlicht nicht mehr. Genau diese Unauffaelligkeit macht Cron Monitoring und Alerting so wichtig: ohne aktive Ueberwachung bleibt ein still ausgefallener Job oft tagelang unentdeckt, bis jemand zufaellig eine veraltete Zahl bemerkt.

Die Ursachen fuer ausbleibende Cron Jobs sind vielfaeltig: ein deaktivierter Systemcron nach einem Serverumzug, ein PHP Fehler, der den gesamten Prozess abbrechen laesst, ein blockierender Lock durch einen haengenden Vorgaenger Job, oder schlicht ein Deployment, das den Cron Eintrag versehentlich entfernt hat. Ohne Cron Monitoring und Alerting unterscheidet sich keiner dieser Faelle von einem normal laufenden System, solange niemand aktiv nachschaut.

Gutes Cron Monitoring und Alerting bedeutet deshalb, die Verfuegbarkeit von Cron Jobs genauso ernst zu nehmen wie die Verfuegbarkeit der Website selbst, mit denselben Prinzipien: aktive Pruefung statt passivem Abwarten, klare Schwellenwerte statt Bauchgefuehl, und automatische Benachrichtigung statt manueller Kontrolle.

2. cron_schedule als Datenquelle fuer Monitoring

Die zentrale Datenquelle fuer jedes Cron Monitoring ist die Tabelle cron_schedule. Jede geplante Ausfuehrung eines Jobs erzeugt eine Zeile mit Job Code, geplanter Zeit, tatsaechlicher Ausfuehrungszeit, Status und im Fehlerfall einer Nachricht. Wer diese Tabelle regelmaessig auswertet, bekommt ohne zusaetzliche Infrastruktur einen verlaesslichen Ueberblick ueber den tatsaechlichen Zustand aller Cron Jobs.


-- Jobs that failed in the last 24 hours, grouped by job code
SELECT job_code, COUNT(*) AS failures, MAX(scheduled_at) AS last_failure
FROM cron_schedule
WHERE status = 'error'
  AND scheduled_at > NOW() - INTERVAL 1 DAY
GROUP BY job_code
ORDER BY failures DESC;

-- Jobs that are stuck in "running" for longer than 30 minutes
SELECT job_code, scheduled_at, executed_at
FROM cron_schedule
WHERE status = 'running'
  AND executed_at < NOW() - INTERVAL 30 MINUTE;

-- Detect a job code that has not run successfully in the last 6 hours
SELECT job_code, MAX(finished_at) AS last_success
FROM cron_schedule
WHERE status = 'success'
GROUP BY job_code
HAVING last_success < NOW() - INTERVAL 6 HOUR;

Diese drei Abfragen decken bereits die haeufigsten Faelle fuer Cron Monitoring und Alerting ab: wiederholt fehlgeschlagene Jobs, haengende Jobs mit Status "running", die nicht mehr weiterkommen, und Jobs, die seit unerwartet langer Zeit gar nicht mehr erfolgreich gelaufen sind. Ein Health Check Skript, das diese Abfragen periodisch ausfuehrt, bildet die Grundlage fuer alles Weitere.

3. Statuswerte richtig interpretieren

Die Statusspalte in cron_schedule kennt die Werte pending, running, success, error und missed. Fuer treffsicheres Cron Monitoring und Alerting ist besonders missed interessant: dieser Status wird gesetzt, wenn ein geplanter Job so lange nicht ausgefuehrt wurde, dass sein Zeitfenster (schedule_lifetime) bereits abgelaufen ist. Viele missed Eintraege innerhalb kurzer Zeit sind ein starkes Signal, dass der Systemcron selbst nicht mehr laeuft oder eine Cron Gruppe komplett blockiert ist.

Ein haeufiger Interpretationsfehler ist, ausschliesslich auf error zu achten und missed zu ignorieren. Ein Job, der schlicht nie gestartet wurde, erzeugt keinen Fehler im klassischen Sinne, sondern verschwindet stillschweigend im Status missed, ohne jemals PHP Code auszufuehren. Vollstaendiges Cron Monitoring und Alerting muss deshalb beide Statuswerte gleichermassen ueberwachen, nicht nur explizite Fehlermeldungen.

4. Eigener Health Check Indexer fuer Cron Status

Fuer strukturiertes Cron Monitoring und Alerting lohnt sich ein dedizierter Health Check Cron Job, der selbst regelmaessig prueft, ob andere kritische Jobs ihren erwarteten Zeitplan einhalten. Dieser Health Check laeuft idealerweise in seiner eigenen, isolierten Cron Gruppe, damit ein Ausfall des Hauptsystems ihn nicht gleich mit lahmlegt.


<?php
declare(strict_types=1);

namespace Vendor\Monitoring\Cron;

use Magento\Framework\App\ResourceConnection;
use Psr\Log\LoggerInterface;

/**
 * Watchdog cron job that inspects cron_schedule for jobs missing their
 * expected execution window and reports critical failures via logger.
 */
class CronHealthCheck
{
    /** @var array<string,int> Job code to maximum allowed silence in minutes. */
    private const WATCHED_JOBS = [
        'vendor_sync_products' => 45,
        'vendor_order_export' => 20,
        'catalog_product_price' => 120,
    ];

    /**
     * @param ResourceConnection $resourceConnection Direct DB access to cron_schedule.
     * @param LoggerInterface $logger Emits alerts consumed by external monitoring.
     */
    public function __construct(
        private readonly ResourceConnection $resourceConnection,
        private readonly LoggerInterface $logger
    ) {
    }

    /**
     * Checks each watched job for staleness and logs a critical alert if breached.
     *
     * @return void
     */
    public function execute(): void
    {
        $connection = $this->resourceConnection->getConnection();
        $table = $this->resourceConnection->getTableName('cron_schedule');

        foreach (self::WATCHED_JOBS as $jobCode => $maxSilenceMinutes) {
            $select = $connection->select()
                ->from($table, ['finished_at'])
                ->where('job_code = ?', $jobCode)
                ->where('status = ?', 'success')
                ->order('finished_at DESC')
                ->limit(1);

            $lastSuccess = $connection->fetchOne($select);
            $silentMinutes = $lastSuccess
                ? (time() - strtotime((string) $lastSuccess)) / 60
                : PHP_INT_MAX;

            if ($silentMinutes > $maxSilenceMinutes) {
                $this->logger->critical(sprintf(
                    'Cron job "%s" has not succeeded in %.0f minutes (limit: %d)',
                    $jobCode,
                    $silentMinutes,
                    $maxSilenceMinutes
                ));
            }
        }
    }
}

Dieser Health Check ist selbst nur ein weiterer Cron Job, deshalb sollte er in einer eigenen Gruppe mit hoher Prioritaet laufen. Sein Zweck ist ausschliesslich Beobachtung, keine eigentliche Geschaeftslogik, was ihn zusaetzlich robust macht, weil er selbst kaum Fehlerquellen mitbringt.

5. Schwellenwerte fuer Alarme sinnvoll definieren

Der Erfolg von Cron Monitoring und Alerting haengt massgeblich davon ab, wie realistisch die Schwellenwerte gewaehlt sind. Ein Job, der planmaessig alle 15 Minuten laeuft, sollte nach etwa 45 Minuten Stille einen Alarm ausloesen, nicht erst nach mehreren Stunden. Ein Job, der planmaessig einmal taeglich laeuft, braucht dagegen einen deutlich groesszuegigeren Schwellenwert, sonst entstehen Fehlalarme, die das Team abstumpfen lassen und echte Probleme im Rauschen untergehen.

Eine bewaehrte Faustregel fuer Cron Monitoring und Alerting ist, den Schwellenwert bei etwa dem Zwei bis Dreifachen des regulaeren Intervalls anzusetzen. Ein alle 15 Minuten laufender Job bekommt damit ein Zeitfenster von 30 bis 45 Minuten, bevor ein Alarm ausgeloest wird, was normale Verzoegerungen durch Systemlast toleriert, aber echte Ausfaelle zuverlaessig erkennt.

6. Anbindung an externe Alerting Systeme

Ein Log Eintrag mit Level critical nuetzt wenig, wenn niemand die Log Datei liest. Fuer produktionsreifes Cron Monitoring und Alerting muss die Erkennung an ein aktives Benachrichtigungssystem angebunden werden, etwa ueber einen dedizierten Monolog Handler, der kritische Log Eintraege an Slack, E-Mail oder ein PagerDuty aehnliches System weiterleitet.


<?xml version="1.0"?>
<!-- app/code/Vendor/Monitoring/etc/crontab.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="vendor_monitoring_group">
        <job name="vendor_cron_health_check" instance="Vendor\Monitoring\Cron\CronHealthCheck" method="execute">
            <!-- Every 10 minutes, independent from monitored jobs -->
            <schedule>*/10 * * * *</schedule>
        </job>
    </group>
</config>

Die Wahl des Alerting Kanals fuer Cron Monitoring und Alerting haengt von der Reaktionszeit ab, die tatsaechlich erwartet wird. E-Mail eignet sich fuer weniger dringende Warnungen, ein Chat Kanal wie Slack fuer taeglich relevante Hinweise, und ein dediziertes Incident System fuer geschaeftskritische Ausfaelle, die eine sofortige Reaktion ausserhalb der Geschaeftszeiten erfordern.

7. Cron Logs systematisch auswerten

Neben der Datenbanktabelle liefert auch die Standard Log Ausgabe von Magento wertvolle Informationen fuer Cron Monitoring und Alerting. Fehler innerhalb eines Cron Jobs, die eine Exception werfen, landen typischerweise in var/log/exception.log, waehrend allgemeine Cron Aktivitaet in var/log/system.log protokolliert wird, sofern das entsprechende Logging aktiviert ist.

Eine sinnvolle Ergaenzung zur reinen cron_schedule Auswertung ist ein periodischer Scan dieser Log Dateien nach bestimmten Mustern, etwa wiederholten Exceptions desselben Typs innerhalb kurzer Zeit. Das Cron Monitoring und Alerting gewinnt dadurch eine zweite, unabhaengige Datenquelle, die auch Faelle erfasst, in denen ein Job zwar als "success" markiert wird, aber intern bereits Warnungen protokolliert hat, die auf ein sich anbahnendes Problem hindeuten.

8. Dead Man Switch: den Watchdog selbst ueberwachen

Ein oft uebersehener blinder Fleck bei Cron Monitoring und Alerting ist die Frage, wer den Watchdog selbst ueberwacht. Faellt der Systemcron komplett aus, laeuft auch der Health Check Job nicht mehr, und das Monitoring System meldet in diesem Fall gar nichts, weil es selbst nicht mehr ausgefuehrt wird. Die Loesung ist ein externer Dead Man Switch: ein aussenstehender Dienst, der erwartet, in regelmaessigen Abstaenden ein Signal vom Health Check Job zu empfangen, und selbst Alarm schlaegt, wenn dieses Signal ausbleibt.

Praktisch umgesetzt bedeutet das, dass der Health Check Job bei jedem erfolgreichen Lauf einen HTTP Request an einen externen Endpunkt, etwa einen Heartbeat Dienst, sendet. Bleibt dieser Heartbeat innerhalb eines definierten Zeitfensters aus, schlaegt der externe Dienst unabhaengig vom internen Zustand des Shops Alarm. Diese Umkehrung der Ueberwachungsrichtung ist der einzige verlaessliche Weg, einen vollstaendigen Ausfall des Cron Systems selbst zu erkennen, statt sich ausschliesslich auf interne Mechanismen zu verlassen.

9. Monitoring Ansaetze im Vergleich

Je nach Reifegrad des Betriebs eignen sich unterschiedliche Kombinationen von Cron Monitoring und Alerting Techniken.

Ansatz Erkennt fehlgeschlagene Jobs Erkennt ausgebliebene Jobs Erkennt Totalausfall des Cron Systems
cron_schedule manuell pruefen Ja, aber nicht automatisch Ja, aber nicht automatisch Nein
Interner Health Check Job Ja Ja Nein
Log Scan Ja Teilweise Nein
Externer Dead Man Switch Indirekt Indirekt Ja

Vollstaendiges Cron Monitoring und Alerting kombiniert alle vier Ebenen: interne cron_schedule Auswertung fuer Detailinformationen, einen Health Check Job fuer aktive Ueberwachung kritischer Jobs, Log Scans fuer zusaetzlichen Kontext, und einen externen Dead Man Switch als letzte Absicherung gegen den kompletten Ausfall des Cron Systems selbst. Nur diese Kombination deckt alle realistischen Ausfallszenarien ab.

Mironsoft

Magento 2 Betriebssicherheit und Monitoring

Wisst ihr sofort, wenn ein kritischer Cron Job ausfaellt?

Wir richten Health Check Jobs, Schwellenwert Alarme und externe Dead Man Switches fuer eure Magento Cron Landschaft ein, damit ausgebliebene oder fehlgeschlagene Jobs euch erreichen, bevor Kunden sie bemerken.

Monitoring Setup

Health Check Jobs und realistische Schwellenwerte fuer eure kritischen Prozesse

Alerting Integration

Anbindung an Slack, E-Mail oder Incident Systeme nach euren Praeferenzen

Dead Man Switch

Absicherung gegen den Totalausfall des Cron Systems selbst

10. Zusammenfassung

Wirksames Cron Monitoring und Alerting in Magento 2 basiert auf mehreren zusammenwirkenden Ebenen: einer systematischen Auswertung von cron_schedule, einem dedizierten Health Check Job mit realistischen Schwellenwerten, einer Anbindung an ein aktives Benachrichtigungssystem und einem externen Dead Man Switch, der auch den vollstaendigen Ausfall des Cron Systems selbst erkennt.

Der wichtigste Perspektivwechsel ist, Cron Jobs als genauso ueberwachungswuerdig zu behandeln wie die Website selbst. Wer Cron Monitoring und Alerting als festen Bestandteil des Betriebskonzepts etabliert, erfaehrt von Ausfaellen innerhalb von Minuten statt erst dann, wenn ein Kunde eine veraltete Zahl oder eine ausgebliebene Bestaetigung meldet.

Cron Monitoring und Alerting in Magento 2, das Wichtigste auf einen Blick

Datenquelle

cron_schedule systematisch nach fehlgeschlagenen, haengenden und ausgebliebenen Jobs auswerten.

Health Check

Dedizierter Cron Job in eigener Gruppe, der kritische Jobs auf Stille prueft und Alarme protokolliert.

Alerting

Anbindung an Slack, E-Mail oder Incident System, Schwellenwerte am Zwei bis Dreifachen des Intervalls.

Dead Man Switch

Externer Heartbeat Dienst erkennt Totalausfall des Cron Systems, den internes Monitoring nicht sehen kann.

11. FAQ: Cron Monitoring und Alerting in Magento 2

1Wichtigste Statuswerte?
error, missed und running fuer verdaechtig lange Bearbeitung.
2Warum nicht nur error beachten?
Nie gestartete Jobs erscheinen als missed, nicht als error.
3Sinnvoller Schwellenwert?
Zwei bis dreifaches des regulaeren Intervalls als Faustregel.
4Was ist ein Dead Man Switch?
Externer Dienst erkennt Totalausfall des Cron Systems ueber ausbleibende Heartbeats.
5Eigene Cron Gruppe fuer Health Check?
Ja, isoliert von den ueberwachten Jobs, sonst faellt die Ueberwachung mit aus.
6Haengenden Job erkennen?
Status running mit deutlich zu altem executed_at Zeitstempel.
7Kanal fuer kritische Ausfaelle?
Dediziertes Incident System mit Eskalation, nicht nur E-Mail.
8Success trotz internem Problem?
Moeglich, zusaetzlicher Log Scan nach Fehlermustern deckt das auf.
9Wie oft Health Check laufen lassen?
5 bis 10 Minuten haben sich in der Praxis bewaehrt.
10Internes Monitoring allein ausreichend?
Nein, externer Dead Man Switch noetig fuer Totalausfall Erkennung.