La moitie qui manquait. Les roles declaraient leurs panneaux, Prometheus en derivait ses cibles, les expressions repondaient, et rien ne les assemblait. serveur_grafana lit les memes meta/metriques.yml que serveur_prometheus et en assemble un tableau par role — la raison du panneau devient sa description dans Grafana. Moisson des tableaux orphelins, prefixe setops-role- pour ne jamais toucher un tableau ecrit a la main, JSON valide avant d etre pose (Grafana ne tombe pas sur un tableau illisible : il le saute en silence). client_metrique declare quatre panneaux sans exportateur — le cas symetrique. Celui qui compte : la memoire disponible, depuis que le ballon est actif. Eprouve sur le site : les deux tableaux charges dans le stockage unifie, un temoin orphelin retire, les quatre panneaux de flotte a 10 series chacun. Un panneau etait faux — /var/lib/lxcfs rapporte toujours zero octet libre et un min() en meurt. Corrige en liste blanche : un montage inconnu manque au graphe, ce qui se voit, au lieu de l ecraser. P77 garde la table des unites : une unite inventee retombe sur short, lisible et fausse. 76 OK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
85 lines
4.6 KiB
YAML
85 lines
4.6 KiB
YAML
---
|
|
# Metriques derivees du role. Le pendant de `meta/supervision.yml`, et son contraire.
|
|
#
|
|
# `supervision.yml` -> une SONDE rend un VERDICT avec un TTL. « est-ce casse ? »
|
|
# `metriques.yml` -> un EXPORTATEUR expose une SERIE. « depuis quand,
|
|
# et vers ou ? »
|
|
#
|
|
# PAS D'`exportateur:` ICI, ET C'EST VOULU. Ce role EST celui qui pose node_exporter, et
|
|
# le job `node` est ecrit en dur dans `prometheus.yml.j2` parce qu'il est UNIVERSEL : il
|
|
# vise toute la flotte, pas les porteurs d'un role. Le deriver d'ici le ferait exister
|
|
# deux fois, et deux ecritures d'un meme fait finissent par diverger.
|
|
#
|
|
# Ce fichier n'apporte donc que des `panneaux` — la moitie que personne ne portait. C'est
|
|
# le cas symetrique de celui que le moteur sait deja traiter : un role peut declarer un
|
|
# exportateur sans panneau, il peut declarer des panneaux sans exportateur.
|
|
#
|
|
# LE CRITERE, LE MEME QUE PARTOUT : une serie a sa place ici si elle PRECEDE un verdict ou
|
|
# si elle n'en aura jamais. Ce qui bascule d'un coup appartient a Icinga ; ce qui derive
|
|
# lentement n'a que le graphe pour se faire voir.
|
|
#
|
|
# TOUT EST AGREGE PAR `instance`. node_exporter publie une serie par interface, par point
|
|
# de montage, par coeur : 339 series pour le seul trafic reseau du site, mesure le
|
|
# 2026-09-14. Un panneau qui les montre toutes ne montre rien.
|
|
panneaux:
|
|
- titre: "Mémoire disponible (part du total)"
|
|
expr: >-
|
|
sum by (instance) (node_memory_MemAvailable_bytes)
|
|
/ clamp_min(sum by (instance) (node_memory_MemTotal_bytes), 1)
|
|
unite: ratio
|
|
raison: >-
|
|
CELUI-LA COMPTE DEPUIS QUE LE BALLON EST ACTIF. L'hyperviseur reprend de la memoire
|
|
a une VM qui n'en a pas besoin — silencieusement, 100 Mio par cycle. La VM ne voit
|
|
pas son plafond bouger : elle voit sa marge fondre. Aucun verdict ne peut se poser
|
|
la-dessus, parce qu'il n'y a pas de seuil juste : c'est la PENTE qui dit si le
|
|
plancher a ete pris trop bas.
|
|
|
|
- titre: "Espace libre — le point de montage le plus serré"
|
|
# UNE LISTE BLANCHE DE SYSTEMES DE FICHIERS REELS, ET PAS UNE LISTE NOIRE.
|
|
#
|
|
# La premiere ecriture excluait `tmpfs|devtmpfs|overlay|squashfs`. Mesure du
|
|
# 2026-09-14 sur la flotte : le panneau rendait **0 octet libre** pour les trois
|
|
# hyperviseurs. Le coupable etait `/var/lib/lxcfs`, un systeme FUSE virtuel qui
|
|
# rapporte toujours zero — et qui n'est pas en lecture seule, donc aucun filtre
|
|
# malin ne l'ecartait.
|
|
#
|
|
# UN `min()` EST IMPITOYABLE : un seul montage pathologique suffit a rendre le
|
|
# panneau inutile POUR TOUJOURS, et sa courbe plate ressemble a un disque plein.
|
|
# C'est la pire sorte de faux : lisible, alarmant, et faux.
|
|
#
|
|
# Une liste noire suit ce qui existe — elle prend donc du retard des qu'un systeme de
|
|
# fichiers nouveau apparait. Une liste blanche, elle, ignore par defaut : un montage
|
|
# inconnu manque au graphe, ce qui se voit, au lieu de l'ecraser, ce qui ne se voit
|
|
# pas. Mesure du 2026-09-14 : la flotte ne monte que ext4, vfat, tmpfs, fuse et
|
|
# fuse.lxcfs.
|
|
expr: >-
|
|
min by (instance) (node_filesystem_avail_bytes{fstype=~"ext4|xfs|btrfs|zfs"})
|
|
unite: octets
|
|
raison: >-
|
|
La sonde `sante` crie quand un seuil est franchi. Ce panneau dit ce qu'elle ne peut
|
|
pas dire : DANS COMBIEN DE TEMPS. Un disque qui perd 2 Go par semaine n'a rien
|
|
casse — il annonce la date ou il cassera, et c'est la seule chose qu'on ne peut pas
|
|
mesurer apres coup.
|
|
|
|
- titre: "Charge par cœur"
|
|
expr: >-
|
|
node_load1
|
|
/ on(instance) group_left count by (instance) (node_cpu_seconds_total{mode="idle"})
|
|
unite: nombre
|
|
raison: >-
|
|
NORMALISEE, sinon elle ne se compare pas : une charge de 4 est confortable sur huit
|
|
coeurs et desastreuse sur deux. Au-dessus de 1, la machine attend plus qu'elle ne
|
|
travaille. C'est le contexte des trois autres — une memoire qui fond a charge
|
|
CONSTANTE ne dit pas la meme chose qu'une memoire qui fond parce que le travail a
|
|
double.
|
|
|
|
- titre: "Trafic réseau entrant"
|
|
expr: >-
|
|
sum by (instance) (rate(node_network_receive_bytes_total{device!="lo"}[5m]))
|
|
unite: octets_par_seconde
|
|
raison: >-
|
|
Il n'aura JAMAIS de verdict, et c'est pourquoi il est la. Aucun seuil de trafic
|
|
n'est juste : ce qui se lit, c'est le changement de FORME — un plateau la ou il y
|
|
avait des vagues, un creux aux heures ouvrables. Une sauvegarde qui ne part plus et
|
|
un flux qu'on vient de fermer se ressemblent ici, et ne se voient nulle part
|
|
ailleurs.
|