[33] Ajout collecteur #109

Merged
lenaic merged 4 commits from justine/33-collecte-bronze into develop 2026-09-03 10:22:05 +00:00
Member

Ce que ça change

Ajout de la collecte bronze avec :

  • Relève par minute des sept sites, horodatée à la réception
  • Réponse brute en bronze, champs vides, null_reasons, data_quality
  • Une source indisponible n'arrête rien et ne perd rien en silence

Closes #

Preuve


Relecture

  • Un pair a relu et laissé un commentaire, même court
  • Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas

Ce qui suit le code

  • docs/runbooks/ mis à jour, un geste d'exploitation a changé
  • docs/adr/ complété, une décision structurante a été prise
  • docs/journal.md complété, un incident a été rencontré
  • Une nouvelle variable d'environnement est apparue, elle est dans .env.example

Où regarder en priorité

## Ce que ça change Ajout de la collecte bronze avec : - Relève par minute des sept sites, horodatée à la réception - Réponse brute en bronze, champs vides, null_reasons, data_quality - Une source indisponible n'arrête rien et ne perd rien en silence Closes # ## Preuve <!-- Ce que la chaîne d'intégration ne peut pas vérifier à ma place : sortie de commande, capture d'écran, journal d'exécution. La chaîne contrôle déjà le format, les tests et l'absence de secrets, inutile de le répéter ici. --> ``` ``` ## Relecture - [ ] Un pair a relu et laissé un commentaire, même court - [ ] Ses remarques sont traitées, ou une réponse explique pourquoi elles ne le sont pas ## Ce qui suit le code <!-- Ne cocher que ce qui s'applique, supprimer le reste. --> - [ ] `docs/runbooks/` mis à jour, un geste d'exploitation a changé - [x] `docs/adr/` complété, une décision structurante a été prise - [ ] `docs/journal.md` complété, un incident a été rencontré - [ ] Une nouvelle variable d'environnement est apparue, elle est dans `.env.example` ## Où regarder en priorité <!-- Là où tu as hésité, ou ce qui mérite un second avis. Facultatif, mais ça fait gagner du temps au relecteur. -->
justine self-assigned this 2026-09-03 09:22:49 +00:00
[33] Ajout collecteur
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 53s
Intégration / Tests unitaires et couverture (pull_request) Successful in 57s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 7s
Intégration / Images épinglées par version (pull_request) Successful in 2s
Intégration / Aucun secret commité (pull_request) Successful in 2s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 1m20s
3cbe853ba6
justine added this to the EnerVision project 2026-09-03 09:22:50 +00:00
justine requested review from lenaic 2026-09-03 09:22:57 +00:00
lenaic requested changes 2026-09-03 09:45:35 +00:00
Dismissed
lenaic left a comment

Du très bon travail, et les trois critères du #33 sont réellement couverts. L'exception est attrapée site par site, l'objet est écrit même quand la source est muette, la clé porte l'horodatage de mesure et l'enveloppe celui de réception. Les tests tiennent l'idempotence par la clé plutôt que par un compteur, c'est la bonne façon.

L'ADR 0007 est ce que j'attends d'une fiche : elle nomme la dérogation à l'ADR 0001 au lieu de la laisser s'installer, elle la borne, et elle nomme elle-même son point faible, les identifiants racine de MinIO. Rien à ajouter dessus.

Vérifié de mon côté : /current horodate à la seconde et avance à chaque appel, donc la troncature à la minute donne bien une clé par minute et par site, sans collision. Et la disposition du pyproject dans le paquet est celle de services/api, donc cohérente avec le dépôt.

Trois corrections, en commentaires de ligne. La première est la seule qui touche le comportement.

Plus deux points mécaniques. La branche est en conflit avec develop sur docs/adr/README.md, un seul fichier. Et Closes # est resté vide dans la description, donc le ticket n'est pas lié à la demande.

Du très bon travail, et les trois critères du #33 sont réellement couverts. L'exception est attrapée site par site, l'objet est écrit même quand la source est muette, la clé porte l'horodatage de mesure et l'enveloppe celui de réception. Les tests tiennent l'idempotence par la clé plutôt que par un compteur, c'est la bonne façon. L'ADR 0007 est ce que j'attends d'une fiche : elle nomme la dérogation à l'ADR 0001 au lieu de la laisser s'installer, elle la borne, et elle nomme elle-même son point faible, les identifiants racine de MinIO. Rien à ajouter dessus. Vérifié de mon côté : `/current` horodate à la seconde et avance à chaque appel, donc la troncature à la minute donne bien une clé par minute et par site, sans collision. Et la disposition du `pyproject` dans le paquet est celle de `services/api`, donc cohérente avec le dépôt. **Trois corrections, en commentaires de ligne.** La première est la seule qui touche le comportement. **Plus deux points mécaniques.** La branche est en conflit avec `develop` sur `docs/adr/README.md`, un seul fichier. Et `Closes #` est resté vide dans la description, donc le ticket n'est pas lié à la demande.
@ -26,3 +26,3 @@
## 2. État au 1er septembre
## 2. État au 3 septembre
Owner

Tant que tu es dans ce tableau : les deux lignes juste au-dessus sont périmées.

MinIO y est encore en « non déployé », et le versioning en « non encore vérifié sur le serveur ». Or le conteneur est Up et healthy depuis 20 heures, le ticket #28 est fermé, et le versioning de bronze a été livré par la #87 puis corrigé par la #90, ticket #85 fermé ce matin.

La convention annoncée en haut du document est que chaque composant porte son état réel.

Tant que tu es dans ce tableau : les deux lignes juste au-dessus sont périmées. MinIO y est encore en « non déployé », et le versioning en « non encore vérifié sur le serveur ». Or le conteneur est `Up` et `healthy` depuis 20 heures, le ticket #28 est fermé, et le versioning de `bronze` a été livré par la #87 puis corrigé par la #90, ticket #85 fermé ce matin. La convention annoncée en haut du document est que chaque composant porte son état réel.
@ -4,0 +8,4 @@
| `collector.current` | **fait** — relève `/current`, une passe par minute, écriture brute en bronze |
| `collector.backfill` | **non commencé** — rattrapage `/readings` (EF-02), ticket #33 rouvert |
| Alertes | **non commencé** — ingestion et historisation (EF-05), ticket #33 rouvert |
Owner

Le rattrapage /readings et les alertes ne sont plus au #33 : ils sont partis au #107 ce matin, quand on a séparé les deux sources.

Le #33 ne porte plus que la relève à la minute, c'est-à-dire exactement ce que cette demande livre. Il n'est donc pas « rouvert », il est complet une fois les corrections passées.

Le rattrapage `/readings` et les alertes ne sont plus au #33 : ils sont partis au **#107** ce matin, quand on a séparé les deux sources. Le #33 ne porte plus que la relève à la minute, c'est-à-dire exactement ce que cette demande livre. Il n'est donc pas « rouvert », il est complet une fois les corrections passées.
@ -0,0 +188,4 @@
indisponible en est un c'est le seul cas où de la mesure se perd.
"""
return 0 if any(r.ecrit for r in releves) else 1
Owner

any laisse passer l'échec partiel. Si l'écriture bronze échoue pour six sites sur sept, la passe rend 0 et cron ne dit rien, alors que six mesures sont perdues.

C'est la perte silencieuse que le critère 3 du ticket interdit. Le tableau du README.md ne couvre d'ailleurs que « MinIO injoignable », qui fait tomber les sept d'un coup, et pas le cas partiel : refus sur une clé, objet rejeté, 503 transitoire sur un seul PUT.

all au lieu de any. Le raisonnement du docstring reste juste, il est simplement à écrire sur tous les relevés plutôt que sur au moins un.

`any` laisse passer l'échec partiel. Si l'écriture bronze échoue pour six sites sur sept, la passe rend 0 et cron ne dit rien, alors que six mesures sont perdues. C'est la perte silencieuse que le critère 3 du ticket interdit. Le tableau du `README.md` ne couvre d'ailleurs que « MinIO injoignable », qui fait tomber les sept d'un coup, et pas le cas partiel : refus sur une clé, objet rejeté, 503 transitoire sur un seul PUT. `all` au lieu de `any`. Le raisonnement du docstring reste juste, il est simplement à écrire sur tous les relevés plutôt que sur au moins un.
Merge remote-tracking branch 'origin/justine/33-collecte-bronze' into justine/33-collecte-bronze
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 49s
Intégration / Tests unitaires et couverture (pull_request) Successful in 50s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 14s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Tableau de bord (pull_request) Successful in 21s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 1m24s
57dc798829
# Conflicts:
#	docs/adr/README.md
[33] Rebase & retours MR
All checks were successful
Intégration / Qualité du code Python (pull_request) Successful in 51s
Intégration / Tests unitaires et couverture (pull_request) Successful in 57s
Intégration / Dépendances du tableau de bord (pull_request) Successful in 14s
Intégration / Images épinglées par version (pull_request) Successful in 3s
Intégration / Tableau de bord (pull_request) Successful in 20s
Intégration / Aucun secret commité (pull_request) Successful in 3s
Intégration / Dépendances Python et inventaire applicatif (pull_request) Successful in 1m28s
fccf40992a
lenaic approved these changes 2026-09-03 10:22:02 +00:00
lenaic merged commit 6613760c4b into develop 2026-09-03 10:22:05 +00:00
lenaic deleted branch justine/33-collecte-bronze 2026-09-03 10:22:05 +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!109
No description provided.