Le planificateur de tâches de Laravel fournit une gestion élégante de cron, mais les tâches planifiées peuvent quand même échouer silencieusement. Voici comment configurer un monitoring fiable pour vos commandes Laravel planifiées.
Le Scheduler Laravel
Le scheduler de Laravel est configuré dans app/Console/Kernel.php :
protected function schedule(Schedule $schedule)
{
$schedule->command('reports:generate')->daily();
$schedule->command('backup:run')->dailyAt('02:00');
$schedule->job(new ProcessPendingOrders)->everyFiveMinutes();
}
Cela s'exécute via une seule entrée cron :
* * * * * cd /chemin-vers-projet && php artisan schedule:run >> /dev/null 2>&1
Pourquoi Monitorer les Tâches Laravel ?
Même avec le scheduler de Laravel, les tâches peuvent échouer :
- Erreurs PHP dans le code de votre commande
- Épuisement de mémoire pendant le traitement
- Problèmes de connexion à la base de données
- Échecs d'API externes
- Daemon cron qui ne tourne pas
- Le scheduler lui-même n'est pas appelé
Méthodes de Monitoring Intégrées
Utiliser pingBefore et thenPing
Laravel 8+ inclut des callbacks de ping :
$schedule->command('backup:run')
->daily()
->pingBefore('https://wizstatus.com/ping/TOKEN/start')
->thenPing('https://wizstatus.com/ping/TOKEN');
pingBefore()- Ping quand le job démarrethenPing()- Ping quand le job se termine avec succèspingOnSuccess()- Ping uniquement en cas de succèspingOnFailure()- Ping uniquement en cas d'échec
Ping Uniquement en Cas de Succès
$schedule->command('reports:generate')
->daily()
->pingOnSuccess('https://wizstatus.com/ping/reports-success');
URLs Différentes pour Succès/Échec
$schedule->command('critical:process')
->hourly()
->pingOnSuccess('https://wizstatus.com/ping/critical-success')
->pingOnFailure('https://wizstatus.com/ping/critical-failed');
Configurer les Moniteurs Heartbeat
Étape 1 : Créer un Moniteur par Tâche
Pour chaque tâche planifiée :
- Créez un moniteur heartbeat nommé d'après la tâche
- Définissez le planning correspondant à la config Laravel
- Définissez une période de grâce appropriée
Étape 2 : Ajouter les Pings au Schedule
protected function schedule(Schedule $schedule)
{
// Sauvegarde quotidienne
$schedule->command('backup:run')
->dailyAt('02:00')
->pingOnSuccess(env('PING_BACKUP'));
// Rapports horaires
$schedule->command('reports:hourly')
->hourly()
->pingOnSuccess(env('PING_REPORTS_HOURLY'));
// Check de santé du worker de queue
$schedule->call(function () {
if (Queue::size() < 1000) {
Http::get(env('PING_QUEUE_HEALTH'));
}
})->everyFiveMinutes();
}
Étape 3 : Stocker les URLs de Ping de Façon Sécurisée
Ajoutez au .env :
PING_BACKUP=https://wizstatus.com/ping/backup-token
PING_REPORTS_HOURLY=https://wizstatus.com/ping/reports-token
PING_QUEUE_HEALTH=https://wizstatus.com/ping/queue-token
Monitoring du Scheduler Lui-Même
Assurez-vous que le scheduler est appelé :
// Dans Kernel.php - ajoutez un check de santé du scheduler
$schedule->call(function () {
// Ceci s'exécute chaque minute pour confirmer que le scheduler est vivant
})->everyMinute()
->pingOnSuccess(env('PING_SCHEDULER_ALIVE'));
Définissez le moniteur :
- Planning : Chaque minute
- Période de grâce : 3 minutes
Bonnes Pratiques
- Un moniteur par tâche - Ne combinez pas plusieurs tâches
- Correspondance exacte des plannings - Planning du moniteur = planning Laravel
- Utilisez env pour les URLs - Gardez les tokens hors du code
- Pingez uniquement en cas de succès - Laissez les échecs déclencher des alertes par absence
- Testez en staging - Vérifiez que les pings fonctionnent avant la production
- Documentez les tâches - Gardez une liste de ce qui est monitoré
Checklist de Monitoring
- Toutes les tâches planifiées critiques ont des moniteurs
- Les plannings des moniteurs correspondent aux plannings Laravel
- Les périodes de grâce prennent en compte la durée des jobs
- Les URLs de ping sont stockées dans les variables d'environnement
- Testé sur l'environnement de staging
- Check de santé du scheduler configuré
- Canaux d'alerte configurés de façon appropriée