Heartbeat Monitoring pour Applications

Envoyez des signaux réguliers pour prouver que votre application fonctionne correctement

Le heartbeat (qu'on pourrait traduire, littéralement - mais pas très élégamment - par « ping de vie ») est un mécanisme de surveillance qui repose sur un principe simple mais puissant : votre application envoie régulièrement un signal à un service de monitoring pour prouver qu'elle est vivante et fonctionne correctement. L'absence de ce signal déclenche une alerte, permettant de détecter des pannes qui passeraient autrement inaperçues.

Contrairement au monitoring HTTP classique qui teste la disponibilité d'une URL depuis l'extérieur, le heartbeat est émis depuis l'intérieur de votre application. Cette approche "inside-out" permet de surveiller des processus qui n'exposent pas d'interface HTTP : crons, workers de queue, scripts batch, synchronisations de données. Si le processus ne s'exécute pas ou plante avant de terminer, aucun ping n'est envoyé et vous êtes alerté.

Cette technique est particulièrement efficace pour les processus qui s'exécutent périodiquement et dont l'échec peut passer inaperçu pendant des jours : sauvegardes automatiques, imports de données, génération de rapports, nettoyage de fichiers temporaires. Le heartbeat garantit que vous serez alerté si un de ces processus critiques cesse de fonctionner.

Comment Fonctionne le Heartbeat

Le mécanisme du heartbeat repose sur quatre composants qui travaillent ensemble pour garantir une surveillance fiable de vos processus.

  • Signal pĂ©riodique : Votre application ou script envoie un simple appel HTTP (GET ou POST) Ă  une URL unique fournie par MoniTao. Ce signal peut ĂŞtre envoyĂ© Ă  intervalle fixe (toutes les minutes pour un service) ou après chaque exĂ©cution rĂ©ussie (pour un cron quotidien).
  • Attente configurĂ©e : MoniTao connaĂ®t la frĂ©quence attendue de vos pings. Si vous configurez un heartbeat quotidien, le système attend un ping toutes les 24 heures. Une pĂ©riode de grâce configurable permet d'absorber les variations normales de timing.
  • DĂ©tection d'absence : Si le ping n'arrive pas dans le dĂ©lai configurĂ© (intervalle + pĂ©riode de grâce), MoniTao passe le job en statut "late", puis "failed". C'est l'absence de signal qui dĂ©clenche l'alerte, pas une erreur active.
  • Alerte immĂ©diate : Dès que le statut passe en "failed", vous recevez une notification via vos canaux configurĂ©s : email, SMS, webhook, Slack. L'alerte indique le nom du job, l'heure du dernier ping, et le retard constatĂ©.

Quand Envoyer le Heartbeat

Le positionnement du ping dans votre code est crucial pour garantir une surveillance efficace. Voici les différentes situations et les bonnes pratiques associées.

  • Fin d'exĂ©cution rĂ©ussie : Le cas le plus courant est d'envoyer le ping Ă  la toute fin d'un job ou script, uniquement si l'exĂ©cution s'est terminĂ©e avec succès. Placez l'appel après toutes les opĂ©rations critiques et après la vĂ©rification du rĂ©sultat. Si une erreur survient, le ping n'est pas envoyĂ© et vous ĂŞtes alertĂ©.
  • Boucle de service : Pour un service long-running (worker de queue, daemon), envoyez un ping Ă  intervalle fixe (toutes les 1-5 minutes) dans la boucle principale. Cela prouve que le service est vivant et traite des messages. Si le processus se bloque ou meurt, les pings cessent.
  • Après validation mĂ©tier : Pour certains jobs, l'exĂ©cution technique peut rĂ©ussir mais le rĂ©sultat mĂ©tier ĂŞtre incorrect (0 enregistrements traitĂ©s, fichier vide gĂ©nĂ©rĂ©). Ajoutez une validation avant le ping : vĂ©rifiez que des donnĂ©es ont bien Ă©tĂ© traitĂ©es, que le fichier de backup a une taille raisonnable.
  • Jobs avec dĂ©marrage conditionnel : Certains jobs ne s'exĂ©cutent que si une condition est remplie (donnĂ©es Ă  traiter, heure spĂ©cifique). Dans ce cas, pingez mĂŞme quand il n'y a rien Ă  faire - cela prouve que le job s'est exĂ©cutĂ© et a vĂ©rifiĂ© la condition. Sinon, vous ne saurez pas distinguer "pas de travail" de "job pas lancĂ©".

Exemples d'Intégration par Langage

Voici des exemples complets d'intégration du heartbeat dans différents langages et contextes. Tous les exemples incluent une gestion des erreurs appropriée et des bonnes pratiques.

Bash / Shell (Crontab)

#!/bin/bash
# Backup script avec heartbeat

PING_URL="https://ping.monitao.com/p/VOTRE_TOKEN"

# Exécuter le backup
/usr/bin/mysqldump -u root -p'password' mydb > /backup/db.sql
RESULT=$?

# Ping uniquement si le backup a réussi
if [ $RESULT -eq 0 ]; then
    # Vérifier que le fichier n'est pas vide
    if [ -s /backup/db.sql ]; then
        curl -fsS --retry 3 --max-time 10 "$PING_URL" > /dev/null
        echo "Backup OK, ping envoyé"
    else
        echo "Fichier backup vide, pas de ping"
        exit 1
    fi
else
    echo "Erreur backup, pas de ping"
    exit 1
fi

Ce script vérifie non seulement le code de retour de mysqldump mais aussi que le fichier généré n'est pas vide. Le curl utilise --retry 3 pour réessayer en cas d'échec réseau temporaire, et --max-time 10 pour éviter de bloquer indéfiniment.

PHP (Laravel / Symfony)

generateReports();

            // Validation: au moins quelques rapports générés
            if ($count === 0) {
                $this->warn('Aucun rapport généré');
                // On ping quand même car le job s'est exécuté
            }

            // Ping avec métriques
            Http::timeout(10)->retry(3)->post(
                'https://ping.monitao.com/p/VOTRE_TOKEN',
                ['duration' => $this->executionTime, 'count' => $count]
            );

            $this->info("Terminé: {$count} rapports");

        } catch (\Exception $e) {
            report($e);
            // Pas de ping = alerte MoniTao
            return 1;
        }
    }
}

L'exemple Laravel utilise le client HTTP intégré avec retry automatique. Les métriques (durée, nombre d'éléments) sont envoyées avec le ping pour un monitoring enrichi. L'exception interrompt le script avant le ping.

Python

import requests
import sys
from datetime import datetime

PING_URL = "https://ping.monitao.com/p/VOTRE_TOKEN"

def ping_monitao(duration_ms=None, status="success"):
    """Envoie un ping Ă  MoniTao avec retry"""
    payload = {"status": status}
    if duration_ms:
        payload["duration"] = duration_ms

    for attempt in range(3):
        try:
            response = requests.post(
                PING_URL,
                json=payload,
                timeout=10
            )
            if response.ok:
                return True
        except requests.RequestException:
            continue
    return False

def main():
    start = datetime.now()
    try:
        # Votre logique métier
        process_data()
        sync_database()
        generate_reports()

        # Calcul durée et ping
        duration = (datetime.now() - start).total_seconds() * 1000
        ping_monitao(duration_ms=duration)
        print(f"Terminé en {duration:.0f}ms")

    except Exception as e:
        print(f"Erreur: {e}", file=sys.stderr)
        # Pas de ping = alerte
        sys.exit(1)

if __name__ == "__main__":
    main()

Le script Python inclut une fonction réutilisable avec retry intégré. La durée d'exécution est calculée et envoyée avec le ping, permettant de suivre les tendances de performance dans l'historique MoniTao.

Node.js

const https = require('https');

const PING_URL = 'https://ping.monitao.com/p/VOTRE_TOKEN';

async function pingMonitao(metrics = {}) {
    return new Promise((resolve) => {
        const data = JSON.stringify(metrics);
        const url = new URL(PING_URL);

        const req = https.request({
            hostname: url.hostname,
            path: url.pathname,
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': data.length
            },
            timeout: 10000
        }, (res) => resolve(res.statusCode < 400));

        req.on('error', () => resolve(false));
        req.write(data);
        req.end();
    });
}

async function main() {
    const start = Date.now();
    try {
        await processQueue();
        await syncData();

        const duration = Date.now() - start;
        await pingMonitao({ duration, items: processedCount });
        console.log(`Done in ${duration}ms`);

    } catch (error) {
        console.error('Error:', error.message);
        process.exit(1);
    }
}

main();

L'exemple Node.js utilise le module https natif sans dépendance externe. La fonction pingMonitao retourne une promesse et peut être facilement intégrée dans n'importe quel script async/await.

Bonnes Pratiques d'Implémentation

Ces recommandations vous aideront à tirer le meilleur parti du heartbeat tout en évitant les pièges courants.

  • Pingez Ă  la fin, pas au dĂ©but : Le ping doit toujours ĂŞtre la dernière action de votre script, après toutes les opĂ©rations critiques. Pinger au dĂ©but ou au milieu donne une fausse assurance : le job peut Ă©chouer après le ping sans que vous soyez alertĂ©.
  • GĂ©rez les timeouts : Ajoutez toujours un timeout Ă  votre appel HTTP (5-10 secondes). Un problème rĂ©seau ne doit pas bloquer votre script principal. Si le ping Ă©choue après les retries, loggez l'erreur mais laissez le script terminer normalement.
  • Utilisez les retries : Un problème rĂ©seau temporaire peut faire Ă©chouer le ping. Configurez 2-3 retries automatiques avec un court dĂ©lai entre chaque tentative. Cela amĂ©liore considĂ©rablement la fiabilitĂ© sans impact significatif sur la durĂ©e.
  • Envoyez des mĂ©triques : Profitez du ping pour envoyer des donnĂ©es utiles : durĂ©e d'exĂ©cution, nombre d'Ă©lĂ©ments traitĂ©s, statut dĂ©taillĂ©. Ces mĂ©triques enrichissent l'historique et permettent de dĂ©tecter des dĂ©gradations progressives.
  • Testez le système complet : Après l'intĂ©gration, testez toute la chaĂ®ne : exĂ©cutez le script manuellement, vĂ©rifiez que le ping apparaĂ®t dans MoniTao, puis arrĂŞtez le script et vĂ©rifiez que l'alerte est bien reçue dans le dĂ©lai configurĂ©.

Erreurs Courantes à Éviter

Ces erreurs fréquentes peuvent réduire l'efficacité de votre surveillance ou générer des fausses alertes.

  • Ping avant validation : Pinger avant d'avoir vĂ©rifiĂ© le rĂ©sultat est dangereux. Votre backup peut crĂ©er un fichier vide, votre import peut traiter 0 lignes, votre rapport peut ĂŞtre corrompu. Validez le rĂ©sultat avant de dĂ©clarer le succès via le ping.
  • Ignorer le "succès vide" : Si votre job ne fait rien quand il n'y a pas de donnĂ©es (0 emails Ă  envoyer, 0 fichiers Ă  traiter), vous devez quand mĂŞme pinger. Sinon, vous ne distinguerez pas "rien Ă  faire" de "job pas exĂ©cutĂ©". Pingez pour prouver que le job a tournĂ©.
  • Ping synchrone bloquant : Sans timeout, votre script peut rester bloquĂ© indĂ©finiment si le serveur de ping ne rĂ©pond pas. Cela peut causer des retards en cascade ou des processus zombies. Ajoutez toujours un timeout de 5-10 secondes.
  • PĂ©riode de grâce trop courte : Si votre job prend habituellement 5 minutes mais peut parfois en prendre 10, une pĂ©riode de grâce de 1 minute gĂ©nĂ©rera des fausses alertes. Analysez la variabilitĂ© de vos jobs et configurez une marge suffisante.

Cas d'Usage Concrets

Le heartbeat s'applique à de nombreuses situations. Voici les cas les plus courants avec leurs spécificités d'implémentation.

Workers de Queue

Les workers qui traitent des messages de queue (Redis, RabbitMQ, SQS) sont des candidats idéaux pour le heartbeat. Un worker peut mourir silencieusement (OOM, crash, conteneur évincé) sans que personne ne s'en aperçoive. Envoyez un ping toutes les 1-5 minutes dans la boucle principale du worker. Si le worker meurt, les pings cessent et vous êtes alerté avant que la queue ne se remplisse dangereusement.

Crons de Backup

Les sauvegardes sont critiques mais leur échec est souvent silencieux : le cron ne s'exécute pas, le script plante, l'espace disque est insuffisant. Créez un heartbeat quotidien avec une période de grâce de 4-6 heures. Pingez après avoir vérifié l'intégrité du backup (fichier non vide, checksum valide). Vous saurez immédiatement si une sauvegarde n'a pas eu lieu.

Synchronisations de Données

Les jobs de synchronisation entre systèmes (CRM ↔ ERP, base de données ↔ data warehouse) doivent s'exécuter régulièrement pour maintenir la cohérence. Un arrêt de sync non détecté cause des divergences qui s'accumulent et deviennent coûteuses à corriger. Pingez après chaque cycle de synchronisation réussi, en incluant le nombre d'enregistrements synchronisés dans les métriques.

Checklist d'Intégration

  • CrĂ©er le heartbeat dans MoniTao et rĂ©cupĂ©rer l'URL de ping
  • Configurer l'intervalle correspondant Ă  la frĂ©quence rĂ©elle du job
  • Ajouter une pĂ©riode de grâce suffisante (50-100% de l'intervalle)
  • IntĂ©grer le ping Ă  la fin du script, après validation du succès
  • Ajouter timeout et retries sur l'appel HTTP
  • Tester manuellement : exĂ©cuter le job et vĂ©rifier le ping dans MoniTao

Heartbeat avec MoniTao

MoniTao simplifie la mise en place de heartbeats avec une interface intuitive et des fonctionnalités avancées pour tous vos besoins de surveillance.

  • CrĂ©ation de heartbeat en un clic avec URL de ping unique et sĂ©curisĂ©e
  • Configuration flexible : intervalles de 1 minute Ă  30 jours, pĂ©riode de grâce personnalisable
  • RĂ©ception et stockage des mĂ©triques envoyĂ©es avec chaque ping (durĂ©e, count, status)
  • Historique complet des pings avec graphiques de tendance et dĂ©tection d'anomalies

Questions Fréquentes sur le Heartbeat

Que se passe-t-il si mon ping échoue à cause d'un problème réseau ?

Un ping raté ponctuellement ne déclenche pas d'alerte grâce à la période de grâce. Utilisez des retries (2-3 tentatives) dans votre code pour absorber les problèmes réseau temporaires. Si les échecs persistent au-delà de la période de grâce, vous serez alerté, ce qui est généralement souhaitable car cela indique un problème plus large.

Puis-je envoyer des données avec le ping ?

Oui, MoniTao accepte un payload JSON avec le ping. Vous pouvez envoyer la durée d'exécution, le nombre d'éléments traités, un statut détaillé, ou toute autre métrique pertinente. Ces données sont stockées dans l'historique et permettent d'analyser les tendances et de détecter des dégradations progressives.

Comment gérer plusieurs environnements (prod, staging) ?

Créez un heartbeat distinct pour chaque environnement. Chaque heartbeat a sa propre URL de ping et ses propres paramètres d'alerte. Vous pouvez organiser vos heartbeats par tags ou projets dans MoniTao pour une meilleure visibilité.

Le ping ralentit-il mon script ?

L'impact est négligeable. Un appel HTTP avec timeout de 5 secondes ajoute au maximum 5 secondes à votre script, et en pratique beaucoup moins (quelques dizaines de millisecondes). Pour les jobs très fréquents (toutes les minutes), vous pouvez utiliser un appel asynchrone qui n'attend pas la réponse.

Dois-je pinger mĂŞme si mon job n'a rien fait ?

Oui, absolument. Si votre job vérifie une condition (emails à envoyer, fichiers à traiter) et ne trouve rien à faire, il doit quand même pinger. Le ping prouve que le job s'est exécuté et a vérifié la condition. Sans ping, vous ne pouvez pas distinguer "rien à faire" de "job pas lancé du tout".

Quelle est la différence entre GET et POST pour le ping ?

Les deux méthodes fonctionnent avec MoniTao. GET est plus simple (URL seule) et suffit pour un ping basique. POST permet d'envoyer des données supplémentaires (métriques, statut) dans le corps de la requête. Utilisez POST si vous voulez enrichir votre monitoring avec des métriques.

Surveillez Tous Vos Processus avec le Heartbeat

Le heartbeat est une technique simple mais extrêmement efficace pour surveiller les processus qui ne peuvent pas être testés de l'extérieur. En quelques lignes de code, vous pouvez transformer n'importe quel script, cron ou worker en processus surveillé, avec une alerte garantie en cas d'arrêt inattendu.

Avec MoniTao, l'intégration du heartbeat prend moins de 5 minutes. Créez un heartbeat, copiez l'URL, ajoutez un appel HTTP à la fin de votre script, et vous êtes protégé contre les pannes silencieuses. Ne découvrez plus vos problèmes quand il est trop tard - surveillez proactivement avec le heartbeat.

PrĂŞt Ă  dormir sur vos deux oreilles ?

Commencez gratuitement, sans carte bancaire.