Set-OPS-Public/docs/metriques-conception.md
Daniel Allaire 2bd761b85f exportateur postgresql : la promesse dit ce que fait Prometheus
Vide, le secret ne pose pas l exportateur, mais Prometheus derive quand meme sa
cible : la collecte rougit, et c est voulu. La phrase promettait l inverse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 12:48:29 -04:00

6.6 KiB

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

# 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 et ne crée pas le compte — jamais un mot de passe par défaut. Prometheus, lui, dérive quand même la cible (:9187) de tout hôte de serveur_postgresql : sans le secret, la collecte d'obs-01 passe au rouge. C'est voulu — une base sans métriques doit se voir, et renseigner le secret est la façon de l'éteindre. (Cette page promettait l'inverse jusqu'au 2026-09-28.)

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