Aller au contenu

Les alertes Prometheus

Carte de maintenance du code d’alerte : où se trouve quoi, et comment l’étendre sans rien casser. Le fonctionnement côté administrateur est décrit dans Monitoring & Alertes.

Le code est scindé en deux, pour garder la génération des règles testable :

  • dnf/lib/alerts.nix : fonctions pures qui produisent les règles Prometheus à partir de la topologie. Testées dans dnf/tests/unit/lib/alerts_test.nix.
  • dnf/modules/service/prometheus.nix : câblage impur (Alertmanager, routage par sévérité, sops, bot Matrix, vhost, sondes blackbox).

Toute logique non triviale va dans alerts.nix ; le module se contente de la brancher.

Exposés via dnfLib (voir dnf/lib/default.nix) :

HelperRôle
serviceUnitsService DNF → unité systemd (ex. idmkanidm.service)
nodeClassClasse d’un nœud (critique / non-critique / désactivé) : features alert-* puis profil
nodeAlertEligibleSélection : un nœud n’est surveillé que s’il est nœud réseau/serveur, porte alert-non-critical, ou héberge un service mappé
severityForClassClasse → sévérité (critical ou warning)
hostExpectedUnitsUnités attendues d’un hôte (d’après ses services activés)
mkNodeRuleGroupsNodeDown, ServiceDown, SystemdUnitFailed (+ label reach local/wan)
mkResourceRuleGroupsDisque, RAM, charge, inodes, OOM, FS read-only, prédiction disque, horloge, conntrack
mkNetworkRuleGroupsSondes blackbox (passerelle, tailnet, DNS, ZoneInternetDown)
mkHttpRuleGroupsSondes HTTP : ServiceEndpointDown + expiration de certificat TLS
mkResticRuleGroupsFraîcheur des sauvegardes (ResticBackupStale/Critical)
mkSmartctlRuleGroupsSanté disque SMART (DiskSmartFailing, DiskTemperatureHigh)
mkPostfixRuleGroupsRelais Postfix (PostfixRelayUnhealthy, PostfixDeferredQueueHigh)
mkSynapseRuleGroupsSynapse (SynapseRestarting, SynapseHighErrorRate)
mkMaintenanceRuleGroupsDrapeau de maintenance (silence pendant rebuild)
mkTailscaleRuleGroupsAuto-réparation tailnet (TailscaleUnhealthy, TailscaleFlapping)
mergeRuleGroupsFusionne des fragments en un seul document
mkAlertRuleGroupsRaccourci : nœuds + ressources + restic + SMART + tailscale
mkSilenceRoutesRoutes Alertmanager vers le receiver null (alertes connues, acceptées)

Chaque cible de scrape porte un label host valant le nom d’hôte, posé par mkHostTargets dans prometheus.nix (un static_config par hôte plutôt qu’une liste unique de cibles). Deux effets :

  • le bot Matrix affiche DiskSpaceLow at srv-backup au lieu de l’instance brute <ip>:<port> ;
  • une route de silence peut viser une seule machine.

Le poser au scrape le propage gratuitement à toutes les alertes issues de ces jobs, y compris les règles ressources génériques, qui ignorent tout de la topologie à l’évaluation.

La supervision est opt-out pour l’infrastructure, opt-in pour le reste. nodeAlertEligible retient un nœud uniquement s’il est de classe critical (profil gateway/hcs/server ou feature alert-critical), s’il porte explicitement alert-non-critical, ou s’il héberge au moins un service mappé dans serviceUnits. Un laptop/desktop nu ne génère donc aucune alerte node.

Le Prometheus d’une zone joint les hôtes des autres zones (ex. le HCS public) uniquement via le WAN. Quand internet tombe, ces cibles deviennent injoignables et déclencheraient un faux « host down ». Pour l’éviter :

  • chaque règle node porte un label reach (local même zone, wan cross-zone) ;
  • une sonde blackbox ICMP vers des IP externes alimente ZoneInternetDown (déclenchée seulement si toutes les cibles externes échouent) ;
  • une règle d’inhibition Alertmanager (equal: [zone]) fait taire les alertes reach="wan" de la zone tant que ZoneInternetDown est active — la vraie cause est notifiée, pas les symptômes.

On fusionne donc tout via mergeRuleGroups, puis on n’émet qu’une entrée :

dnf/modules/service/prometheus.nix
services.prometheus.rules = [
(builtins.toJSON (dnfLib.mergeRuleGroups (
[ (dnfLib.mkAlertRuleGroups { inherit nodes; /* … */ }) ]
++ lib.optional alerting.silenceOnRebuild (dnfLib.mkMaintenanceRuleGroups { /* … */ })
++ lib.optional alerting.network.enable (dnfLib.mkNetworkRuleGroups { /* … */ })
)))
];
Je veux…Je touche…
surveiller un nouveau serviceserviceUnits dans alerts.nix
une nouvelle famille de règlesun mkXRuleGroups + l’ajouter au mergeRuleGroups du module
câbler un exporter de métriquesexporter dans son module (gated monitoring-node, bind preferredIp) + job de scrape + mkXRuleGroups gated dans prometheus.nix
changer un seuil par défautdefaultThresholds dans alerts.nix
changer la classe d’un nœudfeature alert-*[:zone] (aucun code)
forcer/exclure un nœud de la surveillancefeature alert-non-critical / alert-disabled
surveiller une URL + son certificat TLSalerting.network.httpProbeUrls dans la config
ajuster la détection de panne internetalerting.network.internetProbeTargets
taire une alerte connue et acceptéealerting.silences dans un module consumer (aucun code)
taire une unité systemd cassée sur tout le parcignoredUnits dans dnf/config/alerts.nix
une nouvelle destinationle bloc alertmanager de prometheus.nix (receiver + route)