Set-OPS-Public/roles/client_metrique/meta/metriques.yml
Daniel Allaire 311f33d6f6 grafana : les panneaux declares deviennent des tableaux
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
2026-09-14 16:32:30 -04:00

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.