Vérifier la santé des Cronjobs

Posté le 6 juin 2020 · 7 minutes de lecture

Bonjour, vous. Je profite de ce début d’article pour te prévenir que le mode sombre est arrivé sur le blog. Pour l’activer, il faut juste cliquer sur la lune à la fin de la barre de navigation. Il faudra probablement supprimer le cache de ton navigateur (ou moins pour le blog) pour valider tous les changements.

Bonne lecture ! 👋


Autant je m’en sors correctement avec le code, autant c’est un peu plus galère avec l’administration système. J’aime beaucoup coder en Bash, automatiser les choses mais je manque de connaissances générales sur les outils à utiliser pour m’aider dans ma tâche d’administratrice du dimanche.

Récemment, un ami m’a parlé de Healthchecks, un outil qui permet de savoir si nos cronjobs tournent correctement. L’objectif est simple: quand un cronjob tourne (ou n’importe quoi d’autre), on envoie une simple requête sur un lien avec un identifiant unique (UUID). Ce lien peut avoir un /fail à la fin pour dire « j’ai merdé ».

Dans mon cas, j’ai opté pour DryCron car que je ne dispose pas d’un SI complet. La seule chose dont je dispose c’est un VPS de 2016 (oui, il faut que je l’upgrade…). Installer Healthchecks sur ce VPS pour vérifier s’il est en vie… moui, un peu inutile. S’il est mort, il ne peut pas vérifier qu’il est mort. 😁

R2D2 qui tombe

C’est plus un article découverte plutôt qu’un article installation, on va voir un peu ce que permet de faire ce service et en quoi il est vraiment cool.

Dashboard & projets

Depuis l’accueil du site, on peut avoir plusieurs projets. Par exemple, j’ai un projet Get Rich or Dev Tryin’ parce que j’ai quand même quelques trucs qui tournent sur mon vieux et fidèle serveur. On peut créer plusieurs projets pour différentes applications. Je compte en faire une seconde bientôt pour vérifier des cronjobs avec Laravel. On verra après comment c’est simple de faire ça parce que… ce n’est que du ping.

La vue des projets est la plus intéressante. Dedans, on peut vérifier la totalité des checks. Est-ce qu’un cron a fonctionné ? Si oui, quand ? Bien sûr, s’il a échoué, on a un petite alerte sympatique. Et encore, tu n’as pas tout vu: ce truc est génial.

Dashboard de Healthchecks

Comme tu peux le voir, il y a diverses intégrations possibles. Pour ma part, j’ai activé les notifications par e-mail et sur Discord. Il y en a une pelletée: Matrix, Mattermost, Telegram, Slack, etc. C’est super facile à mettre en place en plus !

On a également le dernier ping, si celui-ci se termine par /fail ou s’il n’a pas été réalisé, on a une petite alerte sur l’interface et une notification grâce au Gracetime, j’en parle un peu plus bas.

Passons un peu à la création d’un check. Clique juste sur le gros bouton vert « Add check ».

Création des checks

Par défaut, ils n’ont pas de nom; c’est toujours mieux d’avoir un nom que de s’appeler Jane Doe. À droite de l’UUID, cliques sur le petit (edit…) et une modal apparaît.

Création d'un check

Donner un tag et une description peut être utile. Les tags permettront de filtrer les checks quand tu en auras plusieurs.

À partir de la vue de création, on peut aussi configurer la périodicité d’un cron par de simples barres de temps ou directement en lui disant celle du cron. J’ai un cron qui tourne tous les deux mois, il fallait donc passer par la case cron. 😀

Le gracetime

Cette chose, j’ai mis un peu plus de temps à la comprendre. Le Gracetime, c’est le temps dont dispose le job pour se terminer, ou, pour être plus précise: le temps avant l’envoi que les notifications ne soient envoyées. Si tu mets 10 minutes, il attendra 10 minutes + l’heure déclarée du cronjob.

Pour être plus explicite: J’ai un cron déclaré comme suit: 0 4 1 */2 *. Il tourne donc tous le premier du mois à quatre heure du matin tous les deux mois (j’ai un peu galéré). Le gracetime est configuré à 60 minutes, donc s’il n’a pas eu son ping le premier du mois à cinq heure du matin tous les deux mois, il enverra les notifications.

Gif en train de transpirer

En cas d’échec

Quand un ping n’est pas reçu ou a échoué, il ressemble à ceci:

Un échec cuisant

Pas la peine d’essayer le lien, il a été supprimé depuis.

Et avec ça, notification par e-mail et sur Discord qui a été préalablement configuré.

La programmation

Tout est expliqué sur la documentation ! Aucun mal à émettre un ping depuis un script ou un logiciel. Par exemple, avec cURL:

1
curl --retry 3 https://hc-ping.com/9f013578-9dda-41ac-a5c0-8577fd166de5

Ou PHP:

1
file_get_contents('https://hc-ping.com/9f013578-9dda-41ac-a5c0-8577fd166de5');

Pour finir

Toute la documentation se trouve sur le site officiel ou sur ton instance. Il s’agit d’un logiciel libre sous license BSD développé avec Django 3 et Bootstrap.

Encore une fois, c’est grâce à Dryusdan que je connais ce logiciel, en plus c’est également hébergé chez lui. J’ignorais totalement si mes scripts se faisaient, à moins de vérifier manuellement sur mon Archive Cloud vu que mes scripts servent majoritairement à ça. Plus besoin de m’inquiéter avec cet outil; si ça foire, je le sais presque immédiatement.

J’espère t’avoir fait découvrir un outil qui te sera utile un jour ou l’autre. Peut-être même que tu seras cool à ton taf quand tu proposeras Healthchecks parce que tu ignores si tes jobs fonctionnent. Et c’est du vécu: au travail, on a su après deux mois que des crons quotidiens ne fonctionnaient pas.