docs : metriques-conception, l autre moitie d une phrase deja ecrite
supervision-conception disait deja qu une metrique a seuil appartient a Prometheus et Grafana. Ce document est l autre moitie. Il porte le critere des panneaux — une serie a sa place si elle PRECEDE un verdict ou si elle n en aura JAMAIS — le compte de service au moindre droit, la chaine de connexion hors ligne de commande, et la dette du chiffrement ecrite plutot que tue. La carte nomme desormais les deux ensemble : deux questions, deux fichiers meta, un meme patron. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
This commit is contained in:
parent
a431c13025
commit
818a100ded
3 changed files with 148 additions and 3 deletions
|
|
@ -46,7 +46,7 @@
|
|||
| P31 | Documentation : tout ce que le depot FAIT est nomme | — | ✅ OK | 65 scripts expliques et atteignables, 122 cibles make documentees, 68 roles avec README. |
|
||||
| P32 | Intrants exiges par les roles : tous fournis | — | ✅ OK | CONFORME : 38 exigence(s) de role, toutes satisfaites (149 cle(s) declaree(s) par l'instance). |
|
||||
| P33 | Aucune collision de port entre roles co-localises | — | ✅ OK | CONFORME : 35 revendication(s) de port, aucune collision entre roles co-localises (36 groupes). |
|
||||
| P34 | Chaque document declare son lecteur | — | ✅ OK | 45 document(s) declarent leur lecteur (40 genere(s) exempte(s)). |
|
||||
| P34 | Chaque document declare son lecteur | — | ✅ OK | 46 document(s) declarent leur lecteur (40 genere(s) exempte(s)). |
|
||||
| P35 | Toute application exigeant une base en a une au plan | — | ✅ OK | 5 application(s) exigeant une base l'ont toutes (4 entree(s) au registre). |
|
||||
| P36 | Tout detenteur d'etat porte une sauvegarde | — | ✅ OK | 9 hote(s) de l'ecosysteme et 3 du site detiennent de l'etat, tous porteurs de `client_backup` (9 groupe(s) au catalogue). |
|
||||
| P37 | Le placement du tenant existe chez son hebergeur | — | ✅ OK | placement confronte a l'hebergeur monte (SITE-Chezlepro) : noeud, stockage, pont — tous offerts. |
|
||||
|
|
@ -60,7 +60,7 @@
|
|||
| P45 | Pare-feu Proxmox : arme sur les VNet SDN, jamais ailleurs | — | ✅ OK | Le pare-feu Proxmox ne s'arme que sur un VNet SDN (4 cas evalues, dont un qui doit rendre VRAI). |
|
||||
| P46 | Plancher /etc/hosts : un seul role en decide | — | ✅ OK | Un seul maitre du plancher — roles/hosts_statiques/tasks/main.yml : manage_etc_hosts: false ; et le gabarit maitre est pose (roles/hosts_statiques/templates/hos |
|
||||
| P47 | Zones inverses : couvrir l'occupe, et rien de plus | — | ✅ OK | Les zones inverses couvrent l'occupe et rien de plus (5 cas evalues, dont un site a quatre zones et un tenant a une). |
|
||||
| P48 | La carte d'orientation designe ce qui existe, et compte juste | — | ✅ OK | La carte designe 89 chemin(s) qui existent, et ses 7 chiffres correspondent a la mesure. |
|
||||
| P48 | La carte d'orientation designe ce qui existe, et compte juste | — | ✅ OK | La carte designe 92 chemin(s) qui existent, et ses 7 chiffres correspondent a la mesure. |
|
||||
| P49 | Registre des flux : la matrice d'audit est a jour | — | ✅ OK | Le registre des flux reproduit exactement ce que les `meta/flux.yml` declarent (128 lignes). |
|
||||
| P50 | Silences : un refus muet est declare, place en dernier, et motive | — | ✅ OK | 2 silence(s) declare(s), tous en sequence > 1 (la plus haute des 241 regles `pass`), tous non consignes et tous motives. |
|
||||
| P51 | Collections : toutes declarees, toutes epinglees | — | ✅ OK | 3 collection(s) et 2 bibliotheque(s) Python declarees et epinglees : ansible.posix==1.6.2, community.general==10.3.0, community.postgresql==3.10.2 |
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ README de rôles). Cette page comble ces deux trous.
|
|||
|---|---|---|
|
||||
| rôles | 68 | `roles/*/` |
|
||||
| README de rôles | 68 | `roles/*/README.md` — l'écart avec la ligne au-dessus est la dette |
|
||||
| documents | 41 | `docs/*.md` |
|
||||
| documents | 42 | `docs/*.md` |
|
||||
| pièces d'audit | 45 | `docs/audit/*` |
|
||||
| unités de wiki | 27 | `wiki/*.md` |
|
||||
| décisions en vigueur | 85 | lignes `\| **D-nn** \|` de `decisions-architecture.md` |
|
||||
|
|
@ -40,6 +40,7 @@ README de rôles). Cette page comble ces deux trous.
|
|||
| **Services, maturité, dette** | `docs/catalogue-services.md` (**la carte de maturité + la cruft y sont déjà**) |
|
||||
| **Exploitation / VM** | `docs/vm-lifecycle.md`, `docs/procedure-template-debian13-proxmox.md`, `docs/config-proxmox.md`, `docs/nomenclature-vm.md`, `docs/multi-instances.md` |
|
||||
| **Conceptions de domaine** | `docs/identite-sso.md`, `docs/courriel-conception.md`, `docs/bindings-conception.md`, `docs/dns-interne.md`, `docs/dimensionnement-ressources.md`, `docs/integrations-vm.md` |
|
||||
| **Supervision & métriques** | `docs/supervision-conception.md` (les verdicts, vers Icinga) → `docs/metriques-conception.md` (les séries, vers Prometheus et Grafana) — deux questions, deux fichiers `meta/`, un même patron : le rôle déclare, le moteur dérive |
|
||||
| **Réseau / pare-feu** | `docs/flux-conception.md` (le modèle) → `docs/registre-flux.md` (**généré**, matrice d'audit) → `docs/frontiere-opnsense.md` (la bordure nord/sud) ; underlay : `underlay.yml.example` + `make underlay` |
|
||||
| **Ordre de déploiement** | `docs/couches-deploiement.yml` (couches) + `docs/dependances-groupes.yml` (graphe) → `playbooks/site.yml` (**généré**, `make site`) |
|
||||
| **Conformité du déployé** | `docs/devis-services.md` — les **cinq devis de service** (`make identite-plan`, `certificats-plan`, `expositions-plan`, `postgresql-plan`, `courriel-plan`) **et les cinq devis d'infrastructure** (`frontiere-plan`, `proxmox-fw-plan`, `sdn-plan`, `underlay-plan`, `placement-plan`). Répondent à ce que `make prouver` ne demande jamais : *ce qui tourne correspond-il à ce qui est déclaré ?* |
|
||||
|
|
|
|||
144
docs/metriques-conception.md
Normal file
144
docs/metriques-conception.md
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
# Métriques dérivées des rôles
|
||||
|
||||
> **Pour qui :** celui qui ajoute un rôle à Set-OPS et se demande comment ses mesures
|
||||
> arrivent dans Prometheus — et celui qui exploite et veut savoir d'où sortent les
|
||||
> courbes qu'il regarde.
|
||||
|
||||
> **La règle en une phrase.** Un rôle déclare l'exportateur de ses propres mesures ; le
|
||||
> moteur en dérive la cible de scrutation et les panneaux. Comme `meta/flux.yml` engendre
|
||||
> nftables *et* OPNsense, comme `meta/supervision.yml` engendre les services Icinga.
|
||||
|
||||
## Pourquoi un second fichier
|
||||
|
||||
`meta/supervision.yml` et `meta/metriques.yml` répondent à des questions différentes, sur
|
||||
des données différentes, pour des consommateurs différents.
|
||||
|
||||
| | ce qu'il déclare | la question | le consommateur |
|
||||
|---|---|---|---|
|
||||
| `supervision.yml` | une **sonde** qui rend un verdict avec un TTL | *est-ce cassé ?* | Icinga |
|
||||
| `metriques.yml` | un **exportateur** qui expose une série | *depuis quand, et vers où ?* | Prometheus → Grafana |
|
||||
|
||||
Ce n'est pas une frontière inventée pour l'occasion. `docs/supervision-conception.md` la
|
||||
pose déjà dans l'autre sens :
|
||||
|
||||
> Une **métrique à seuil** — durée de collecte, volume de journaux, taux d'occupation —
|
||||
> appartient à Prometheus et Grafana. Icinga répond à une seule question : *est-ce cassé ?*
|
||||
> Mélanger les deux rendrait les deux moins lisibles.
|
||||
|
||||
Ce document est l'autre moitié de cette phrase.
|
||||
|
||||
## Le constat qui l'a rendu nécessaire
|
||||
|
||||
Mesure du 2026-09-14 : **aucune métrique de service n'était collectée.** Prometheus ne
|
||||
scrutait que les `node_exporter` — processeur, mémoire, disques, réseau. Rien de
|
||||
PostgreSQL, rien de l'annuaire, rien des boîtes, rien du cache.
|
||||
|
||||
Le crochet existait pourtant : `serveur_prometheus_cibles_supplementaires`, une liste
|
||||
libre, documentée, et que **personne ne remplissait**. Une facilité offerte à qui saurait
|
||||
qu'elle existe n'est pas un mécanisme ; c'est une note de bas de page.
|
||||
|
||||
## Ce qu'un rôle déclare
|
||||
|
||||
```yaml
|
||||
# roles/<rôle>/meta/metriques.yml
|
||||
exportateur:
|
||||
paquet: prometheus-postgres-exporter
|
||||
service: prometheus-postgres-exporter
|
||||
port: 9187
|
||||
job: postgresql
|
||||
|
||||
panneaux:
|
||||
- titre: "Taux de succès du cache"
|
||||
expr: "..."
|
||||
unite: ratio
|
||||
raison: "..."
|
||||
```
|
||||
|
||||
**L'exportateur** est ce que le rôle installe pour qu'il y ait quelque chose à lire. Le
|
||||
rôle le pose lui-même : il connaît ses chemins, son compte de service, sa vérité de
|
||||
terrain.
|
||||
|
||||
**Les panneaux** sont ce qui mérite d'être regardé dans le temps.
|
||||
|
||||
## Combien de panneaux : un par QUESTION QU'ON SE POSE
|
||||
|
||||
Ni un par métrique — un exportateur en publie couramment plus de deux cents — ni un par
|
||||
rôle. Un par question qu'on se pose vraiment quand quelque chose commence à aller moins
|
||||
bien.
|
||||
|
||||
**Le critère :** *une série a sa place ici si elle **précède** un verdict, ou si elle n'en
|
||||
aura **jamais**.*
|
||||
|
||||
- Les **connexions** précèdent un verdict : la sonde Icinga crie à 70 % et à 90 %, le
|
||||
graphe dit depuis *quand* ça monte. Une base qui passe de 20 à 60 connexions en trois
|
||||
semaines n'a rien cassé — elle annonce la date où elle cassera.
|
||||
- Le **taux de succès du cache** n'aura jamais de verdict, et c'est pourquoi il compte.
|
||||
Quand les données dépassent `shared_buffers`, la base va chercher sur disque de plus en
|
||||
plus souvent. Rien ne casse, rien n'alerte : tout devient lent. C'est exactement la panne
|
||||
qu'un graphe voit et qu'une sonde ne verra jamais.
|
||||
|
||||
Ce qui bascule d'un coup appartient à Icinga. Ce qui dérive lentement n'a que le graphe
|
||||
pour se faire voir.
|
||||
|
||||
## Ce que le moteur dérive
|
||||
|
||||
**La cible de scrutation.** Le nom du dossier du rôle *est* le nom du groupe ; les cibles
|
||||
sont donc les hôtes actifs de ce groupe. Un rôle déclaré sans hôte ne produit aucun job —
|
||||
Prometheus n'a pas à porter une cible qui n'existe pas, ni son journal à se remplir de
|
||||
refus prévisibles.
|
||||
|
||||
**Les panneaux**, pour le tableau de bord.
|
||||
|
||||
Les cibles **écrites au plan** (`serveur_prometheus_cibles_supplementaires`) complètent la
|
||||
dérivation, elles ne la remplacent pas : un équipement ou un service tiers n'a aucun rôle
|
||||
Set-OPS pour se déclarer.
|
||||
|
||||
## Ce que le moteur ne dérive PAS, et c'est délibéré
|
||||
|
||||
**Le flux.** Le port de l'exportateur doit s'ouvrir depuis l'observatoire, et c'est
|
||||
`meta/flux.yml` qui le déclare — là où vivent déjà tous les flux du rôle. Deux fichiers
|
||||
pour un même fait finissent par diverger, et ce dépôt en a assez d'exemples.
|
||||
|
||||
## Le compte de service : le moins de droits possible
|
||||
|
||||
Un exportateur lit des compteurs. Il n'a aucune raison de pouvoir lire des données.
|
||||
|
||||
Pour PostgreSQL, c'est le rôle `pg_monitor` — fourni par le moteur depuis la version 10 —
|
||||
qui donne accès aux vues de statistiques **et à elles seules**. Faire tourner un
|
||||
exportateur sous `postgres` serait donner les clés de la base pour lire des compteurs.
|
||||
|
||||
**Le mot de passe vient de la voûte.** Vide, l'exportateur n'est pas posé du tout : le rôle
|
||||
ne l'installe pas, ne crée pas le compte, et Prometheus ne dérive aucune cible. Dégrader,
|
||||
jamais deviner — et surtout jamais un mot de passe par défaut.
|
||||
|
||||
**La chaîne de connexion ne passe pas par la ligne de commande.** Un `DATA_SOURCE_NAME` en
|
||||
argument serait lisible dans `ps` par tout le monde sur la machine ; dans un fichier à
|
||||
`0600`, il ne l'est que par root et le service.
|
||||
|
||||
## Le chiffrement : ce qui est fait, ce qui ne l'est pas
|
||||
|
||||
`client_metrique` sert ses métriques en **TLS**, certificat synchronisé par `client_pki`.
|
||||
|
||||
Les exportateurs de service ne le font pas encore. La dette est écrite dans la `raison` du
|
||||
flux concerné, avec son remède — `--web.config.file` et l'abonnement au renouvellement.
|
||||
Elle n'est pas cachée derrière un silence.
|
||||
|
||||
## Où en est la couverture
|
||||
|
||||
| déclaration | rôles |
|
||||
|---|---|
|
||||
| `meta/flux.yml` | 39 |
|
||||
| `meta/authentification.yml` | 33 |
|
||||
| `meta/empreinte.yml` | 32 |
|
||||
| `meta/supervision.yml` | 28 |
|
||||
| **`meta/metriques.yml`** | **1** |
|
||||
|
||||
Le second versant commence. Un rôle sans `metriques.yml` n'est pas fautif — beaucoup n'ont
|
||||
aucune série qui mérite un graphe. Mais un service qui porte de l'état et n'en déclare
|
||||
aucune mérite qu'on se demande pourquoi.
|
||||
|
||||
## Quand relire ce document
|
||||
|
||||
- un rôle qui se met à porter de l'état → il lui faut probablement un exportateur
|
||||
- un exportateur qui passe en TLS → la dette du flux se referme, et cette page le dit
|
||||
- un panneau qu'on regarde sans jamais agir dessus → il n'avait pas sa place ici
|
||||
Loading…
Reference in a new issue