Un veilleur hors de Prometheus, pour que son silence cesse de ressembler au bon fonctionnement (#39)
Helm Charts / Detect changed charts (push) Successful in 10s
Helm Charts / Library charts tool (push) Skipped
Helm Charts / Application charts grafana (push) Skipped
Helm Charts / Application charts hashicorp-vault (push) Skipped
Helm Charts / Application charts minio (push) Skipped
Helm Charts / Application charts pgbouncer (push) Skipped
Helm Charts / Application charts pgcat (push) Skipped
Helm Charts / Application charts redis (push) Skipped
Helm Charts / Application charts chart (push) Skipped
Helm Charts / Application charts crowdsec (push) Skipped
Helm Charts / Application charts prometheus (push) Failing after 50s

Un CronJob toutes les 5 minutes interroge Prometheus depuis dehors et pousse
lui-même sur Telegram. Il couvre les trois morts, dont celle qui est arrivée :
répondre parfaitement en n'enregistrant rien.

Éprouvé en vrai sur le cluster : 187 s entre la panne armée et le message
accepté par Telegram, mesuré deux fois. Contre 4620 minutes de silence réel.

Ferme #36.

Co-Authored-By: Claude Opus 5 <[email protected]>
Co-authored-by: Gabriel Radureau <[email protected]>
This commit was merged in pull request #39.
This commit is contained in:
2026-09-07 10:55:16 +02:00
committed by arcodange
co-authored by Claude Opus 5
parent 249ff00d3a
commit dc48d48c1b
6 changed files with 905 additions and 0 deletions
+70
View File
@@ -1265,6 +1265,64 @@ prometheus: &prometheus_config
annotations:
summary: "Homelab — cert {{ $labels.namespace }}/{{ $labels.name }} expire dans {{ $value | humanizeDuration }}"
description: "Le renouvellement automatique (cert-manager → step-issuer → step-ca) est en échec. Vérifier : kubectl get certificaterequest -A, logs step-issuer (résolution DNS de ssl-ca.arcodange.lab), santé de step-ca sur pi1:8443."
# Le veilleur (arcodange-org/tools#36). Du 2026-09-04 02:41 au
# 2026-09-07 07:37, Prometheus n'a rien enregistré et les 11 règles
# ci-dessus se sont TUES — sans échantillon frais, une règle ne se
# déclenche pas. Sur Telegram, ce silence est indiscernable du bon
# fonctionnement.
#
# ⚠⚠ CES DEUX RÈGLES NE SONT PAS LE REMÈDE : elles vivent dans le
# Prometheus surveillé, donc elles sont muettes exactement quand il
# faudrait qu'elles parlent. Le remède est le CronJob
# `veilleur-prometheus` (templates/veilleur.yaml), qui interroge
# Prometheus depuis l'EXTÉRIEUR et pousse lui-même sur Telegram.
# Ces deux règles-ci sont ce que le CronJob observe et ce qui le
# complète — rien de plus.
- name: veilleur
rules:
- alert: Veilleur
# Témoin toujours allumé (dead man's switch). Il ne dit rien de
# l'état du système : il est TOUJOURS vrai. C'est son ABSENCE
# dans Alertmanager qui est le signal, et c'est le CronJob
# `veilleur-prometheus` qui la constate depuis dehors.
#
# ⚠ `vector(1)` ne lit AUCUNE série : ce témoin aurait continué
# de tirer pendant les 3 j 5 h de panne. Il prouve que la chaîne
# évaluation → Alertmanager vit, jamais que le TSDB enregistre.
# C'est le contrôle de fraîcheur du CronJob qui garde ça.
#
# Il ne part PAS sur Telegram : la route `veilleur` d'Alertmanager
# l'envoie au récepteur vide (cf. alertmanager.config plus bas).
# Un témoin qui sonne toutes les 3 h serait un témoin qu'on coupe.
expr: vector(1)
labels:
severity: none
app: veilleur
annotations:
summary: "Témoin toujours allumé — c'est son absence qui est le signal"
description: "Si cette alerte disparaît d'Alertmanager, l'évaluation des règles de Prometheus ou sa livraison vers Alertmanager est arrêtée : AUCUNE alerte ne partirait plus."
- alert: VeilleurMuet
# L'auto-plainte du veilleur, deuxième moitié : il pousse un
# battement au Pushgateway à chaque exécution menée à son terme.
# 1200 s = 4 tours de CronJob (*/5).
#
# ⚠ Cette règle est DANS le Prometheus surveillé : elle ne peut
# rien dire d'un Prometheus mort — ce n'est pas son travail, c'est
# celui du CronJob. Elle couvre le cas inverse : Prometheus en
# pleine forme et le veilleur, lui, à l'arrêt (CronJob suspendu,
# image introuvable, Telegram injoignable). Le cas « les deux à la
# fois » reste NON COUVERT : il faudrait un second canal,
# indépendant de ce homelab.
expr: >-
time() - veilleur_prometheus_derniere_reussite_timestamp_seconds > 1200
or absent(veilleur_prometheus_derniere_reussite_timestamp_seconds)
for: 5m
labels:
severity: critical
app: veilleur
annotations:
summary: "Veilleur — le guetteur extérieur de Prometheus ne rapporte plus"
description: "Le CronJob veilleur-prometheus (ns tools) n'a pas mené une exécution à son terme depuis plus de 20 min. Tant qu'il est muet, une panne d'enregistrement de Prometheus redeviendrait invisible. Vérifier : kubectl -n tools get cronjob,jobs -l app.kubernetes.io/name=veilleur-prometheus puis les journaux du dernier Job."
# groups:
# - name: Instances
# rules:
@@ -1345,7 +1403,19 @@ prometheus: &prometheus_config
group_interval: 5m
repeat_interval: 3h
receiver: telegram
routes:
# Le témoin toujours allumé ne dérange personne : il est là pour être
# CONSTATÉ par le CronJob veilleur-prometheus via /api/v2/alerts, pas
# pour être lu. Sans cette route il sonnerait toutes les 3 h, et un
# témoin qui sonne est un témoin qu'on finit par couper.
- matchers:
- alertname="Veilleur"
receiver: neant
group_wait: 0s
repeat_interval: 8760h
receivers:
# Récepteur vide = trou noir. C'est la forme prévue par Alertmanager.
- name: neant
- name: telegram
telegram_configs:
- bot_token_file: /etc/alertmanager/telegram/BOT_TOKEN