Alertmanager to Statuspage Bridge
Un pont open source qui tient les incidents Atlassian Statuspage à jour tout seul, à partir des alertes Prometheus Alertmanager.
Contexte : Briefing
Quand on met en place une supervision avec Prometheus et Alertmanager, on tombe vite sur le même problème : Alertmanager sait exactement quand quelque chose casse, mais la page de statut que les utilisateurs consultent, elle, n’en sait rien tant que quelqu’un ne va pas créer l’incident à la main. Résultat, les pannes sont annoncées en retard, de façon incohérente, ou pas du tout.
J’ai donc écrit un petit service en Python qui fait le lien entre les deux. Il reçoit les webhooks d’Alertmanager, ouvre l’incident correspondant sur Statuspage quand une alerte se déclenche, le met à jour au fil des alertes qui arrivent ou disparaissent, et le ferme tout seul une fois que tout est revenu à la normale. Je l’ai ensuite documenté, testé et publié en open source sous licence MIT.
Réalisations : Objectifs remplis
- Un service FastAPI qui reçoit les webhooks d’Alertmanager, déclenchements comme résolutions, protégés par un secret partagé.
- Des incidents regroupés par composant Statuspage plutôt que par alerte : quand deux alertes tombent sur le même composant, elles s’ajoutent au même incident, dont la gravité monte d’un cran, au lieu d’en ouvrir deux.
- L’impact de l’incident vient de la gravité réelle de l’alerte, et les composants sont retrouvés par leur nom, pour que personne n’ait à écrire d’identifiants Statuspage en dur dans ses règles d’alerte.
- Les incidents en cours sont sauvegardés sur disque après chaque changement, avec une écriture atomique, pour qu’un crash en pleine écriture ne corrompe jamais l’état.
- Livré en image Docker avec healthcheck et configuration Docker Compose, avec des tests pytest et du lint qui tournent en CI sur GitHub Actions.
Défi technique : Combat de boss
Toujours coller à l’état réel des systèmes
Créer des incidents, c’était la partie facile. Le plus dur, c’était de faire en sorte qu’ils collent toujours à la réalité : une alerte peut être résolue pendant que le pont est arrêté, un webhook de résolution peut se perdre, Alertmanager peut renvoyer plusieurs fois la même alerte, et après un redémarrage ou un crash, le pont doit se souvenir des incidents qu’il avait laissés ouverts. J’ai rendu chaque opération idempotente, sauvegardé l’état après chaque changement, et ajouté une réconciliation qui tourne au démarrage puis à intervalle régulier, compare les incidents ouverts aux alertes réellement actives dans Alertmanager, et ferme tout ce qui ne l’est plus. Même quand un événement se perd en route, Statuspage finit toujours par refléter ce qui se passe vraiment.
Résultats : Récompenses
- Plus aucun incident à ouvrir, mettre à jour ou fermer à la main
- Publié en open source sur GitHub, documenté et testé