infra : tableau de bord Grafana chaîne-donnée (#112) #183

Merged
lenaic merged 2 commits from gabriel/112-dashboard-chaine-donnee into develop 2026-09-08 09:02:11 +00:00
Member

Ajoute le tableau de bord chaine-donnee du #112 : fraîcheur par site, volume ingéré par heure, complétude par site, répartition par régime d'imputation. Tout est en SQL sur la source postgres-metier (table mesure/site, zone or), maintenant que #33/#34/#35 sont closes.

Vérifié en local (infra/compose/supervision/local) avec des données fraîches — les 4 panneaux rendent des valeurs, aucun No data.

Hors de ce PR (dépendances non livrées) :

  • modele : attend #36 et #37
  • sauvegardes : attend #71 ; et l'alerte #172 montre que même la partie déjà livrée (âge/état du dernier vidage) ne remonte aucune métrique côté serveur pour l'instant
  • GRANT pg_monitor : déjà appliqué en prod via une tâche Ansible (roles/app/tasks/main.yml), pas via une migration db/migrations/ comme le demande le critère d'acceptation du #112 — à trancher séparément

tests/ci/test-supervision.sh étendu pour couvrir ce tableau de bord.

Ajoute le tableau de bord `chaine-donnee` du #112 : fraîcheur par site, volume ingéré par heure, complétude par site, répartition par régime d'imputation. Tout est en SQL sur la source `postgres-metier` (table `mesure`/`site`, zone or), maintenant que #33/#34/#35 sont closes. Vérifié en local (`infra/compose/supervision/local`) avec des données fraîches — les 4 panneaux rendent des valeurs, aucun `No data`. Hors de ce PR (dépendances non livrées) : - `modele` : attend #36 et #37 - `sauvegardes` : attend #71 ; et l'alerte #172 montre que même la partie déjà livrée (âge/état du dernier vidage) ne remonte aucune métrique côté serveur pour l'instant - `GRANT pg_monitor` : déjà appliqué en prod via une tâche Ansible (`roles/app/tasks/main.yml`), pas via une migration `db/migrations/` comme le demande le critère d'acceptation du #112 — à trancher séparément `tests/ci/test-supervision.sh` étendu pour couvrir ce tableau de bord.
infra: tableau de bord Grafana chaîne-donnée (#112)
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 8s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 23s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 39s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m19s
514995ac7a
Ajoute le tableau de bord chaine-donnee (fraîcheur par site, volume
ingéré par heure, complétude par site, répartition par régime
d'imputation), branché sur la source postgres-metier maintenant que
#33/#34/#35 écrivent en base. modele et sauvegardes restent hors de ce
ticket : ils dépendent respectivement de #36/#37 et #71, non livrés.

Étend tests/ci/test-supervision.sh pour couvrir ce nouveau tableau de
bord.
supervision: le panneau dit la zone or, pas la zone bronze (#112)
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 6s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 22s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 36s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m29s
b7dbbaee77
Le panneau s'intitulait « Volume ingéré par heure (zone bronze) » et interroge
public.mesure, qui est la zone OR (migration 0007_zone_or_mesure.sql). Le corps
de la demande dit d'ailleurs « zone or » : c'est le titre qui se trompe.

La zone bronze, ce sont les objets JSON de MinIO, que rien ici ne lit. Un jury
qui demande à voir la zone bronze et à qui on montre une requête PostgreSQL,
sur une épreuve dont le médaillon est le sujet, c'est un mauvais moment pour
rien.

Le titre dit maintenant ce que le panneau mesure : le volume en zone or dont
la valeur brute a été conservée.
lenaic approved these changes 2026-09-08 08:48:05 +00:00
lenaic left a comment

Approuvée. J'ai éprouvé les quatre requêtes contre enervision_prod, avec ses 618 240 lignes de mesure, plutôt que sur le jeu local :

Fraîcheur par site        669 ms   7 lignes
Volume par heure           50 ms  24 lignes
Complétude par site        33 ms   7 lignes
Régime d'imputation         4 ms   3 lignes

Aucune ne rend No data, l'uid postgres-metier correspond bien à la source provisionnée, et le rôle grafana a le SELECT sur mesure et sur site — vérifié par has_table_privilege, pas déduit.

Un seul point, et je l'ai corrigé plutôt que de te le renvoyer

Le panneau s'intitulait « Volume ingéré par heure (zone bronze) » et interroge public.mesure, qui est la zone or (0007_zone_or_mesure.sql). Le corps de ta demande dit d'ailleurs « zone or » : c'est le titre qui se trompe.

La zone bronze, ce sont les objets JSON de MinIO, que rien ici ne lit. Sur une épreuve dont le médaillon est le sujet, un jury qui demande à voir la zone bronze et à qui on montre une requête PostgreSQL, c'est un mauvais moment pour rien. Poussé dans b7dbbae, le titre dit maintenant ce que le panneau mesure.

Ce que je ne bloque pas

« Fraîcheur par site » est le seul panneau sans borne temporelle : LEFT JOIN mesure puis max(horodatage) par site, donc il balaie l'hypertable entière. 669 ms aujourd'hui, et la table grossit de 10 000 lignes par jour. Ça tient largement jusqu'au 11, et je ne demande pas de le changer maintenant. Si tu veux le border un jour, un WHERE m.horodatage > now() - interval '48 hours' suffit, avec un NULLS FIRST pour garder visible un site qui n'aurait rien envoyé depuis plus longtemps.

Tes trois exclusions sont justes et bien nommées, en particulier celle des sauvegardes : le #172 est fermé côté correctif, mais la métrique ne remontera qu'une fois la #178 fusionnée.

Le GRANT pg_monitor posé par Ansible plutôt que par une migration mérite effectivement d'être tranché à part, pas ici.

Approuvée. J'ai éprouvé les quatre requêtes contre `enervision_prod`, avec ses 618 240 lignes de `mesure`, plutôt que sur le jeu local : ``` Fraîcheur par site 669 ms 7 lignes Volume par heure 50 ms 24 lignes Complétude par site 33 ms 7 lignes Régime d'imputation 4 ms 3 lignes ``` Aucune ne rend `No data`, l'`uid` `postgres-metier` correspond bien à la source provisionnée, et le rôle `grafana` a le SELECT sur `mesure` et sur `site` — vérifié par `has_table_privilege`, pas déduit. ## Un seul point, et je l'ai corrigé plutôt que de te le renvoyer Le panneau s'intitulait « Volume ingéré par heure (**zone bronze**) » et interroge `public.mesure`, qui est la zone **or** (`0007_zone_or_mesure.sql`). Le corps de ta demande dit d'ailleurs « zone or » : c'est le titre qui se trompe. La zone bronze, ce sont les objets JSON de MinIO, que rien ici ne lit. Sur une épreuve dont le médaillon est le sujet, un jury qui demande à voir la zone bronze et à qui on montre une requête PostgreSQL, c'est un mauvais moment pour rien. Poussé dans `b7dbbae`, le titre dit maintenant ce que le panneau mesure. ## Ce que je ne bloque pas **« Fraîcheur par site » est le seul panneau sans borne temporelle** : `LEFT JOIN mesure` puis `max(horodatage)` par site, donc il balaie l'hypertable entière. 669 ms aujourd'hui, et la table grossit de 10 000 lignes par jour. Ça tient largement jusqu'au 11, et je ne demande pas de le changer maintenant. Si tu veux le border un jour, un `WHERE m.horodatage > now() - interval '48 hours'` suffit, avec un `NULLS FIRST` pour garder visible un site qui n'aurait rien envoyé depuis plus longtemps. Tes trois exclusions sont justes et bien nommées, en particulier celle des sauvegardes : le #172 est fermé côté correctif, mais la métrique ne remontera qu'une fois la #178 fusionnée. Le `GRANT pg_monitor` posé par Ansible plutôt que par une migration mérite effectivement d'être tranché à part, pas ici.
lenaic merged commit fef285078b into develop 2026-09-08 09:02:11 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!183
No description provided.