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. idmkanidmd.service)
nodeClassClasse d’un nœud (critique / non-critique / désactivé) : features alert-* puis profil
severityForClassClasse → sévérité (critical ou warning)
hostExpectedUnitsUnités attendues d’un hôte (d’après ses services activés)
mkNodeRuleGroupsNodeDown, ServiceDown, SystemdUnitFailed
mkResourceRuleGroupsDisque, RAM, charge, inodes, OOM (seuils defaultThresholds)
mkNetworkRuleGroupsSondes blackbox (passerelle, tailnet, DNS)
mkMaintenanceRuleGroupsDrapeau de maintenance (silence pendant rebuild)
mergeRuleGroupsFusionne des fragments en un seul document
mkAlertRuleGroupsRaccourci : nœuds + ressources

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
changer un seuil par défautdefaultThresholds dans alerts.nix
changer la classe d’un nœudfeature alert-*[:zone] (aucun code)
une nouvelle destinationle bloc alertmanager de prometheus.nix (receiver + route)