[EF-05] Les alertes traversent la zone or jusqu'à public.alerte (#168) #169
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!169
Loading…
Reference in a new issue
No description provided.
Delete branch "marvin/168-alertes-zone-or"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ce que ça change
Le #165 fait entrer les alertes de la source en zone argent. Cette demande termine le chemin :
silver.alerte→gold/table=alerte→public.alerte, la seule couche que l'API et Grafana lisent.Avec elle, l'écran Qualité et le pavé « alertes ouvertes » de l'écran Parc cessent de dépendre de fixtures.
Closes #168
⚠️ Demande empilée, à recibler avant la fusion
Base :
marvin/165-alertes-zone-argent, pasdevelop. Le #168 litsilver.alerte, qui n'existe que sur la branche du #165. Empilée, cette demande ne montre que son propre diff ; ouverte surdevelop, elle aurait porté les quatre commits du #165 en plus et personne n'aurait relu l'un sans l'autre.À faire quand la #167 sera fusionnée : recibler celle-ci sur
develop. Aucun conflit attendu, les deux lots ne touchent pas les mêmes fichiers hormisdocs/data/etl-pipeline.md, où ils écrivent dans des sections différentes.Preuve
Et la chaîne des trois zones sur bronze réel, jouée en local, sans rien écrire dans MinIO ni en base :
Ce qui suit le code
docs/: le §12 du pipeline décrit les alertes en zone or, le §15 fait remonter l'EF-05 jusqu'en base, le README de l'ETL gagne sa troisième ligne.docs/runbooks/etl.mdn'est pas étendu à la zone or ici, délibérément : la #159 le fait déjà, et deux demandes qui réécrivent la même section se battraient pour rien.Relecture
@lenaic la relecture est obligatoire :
db/est à toi dansCODEOWNERS, et cette demande porte la migration0017.Où regarder en priorité
1. La migration
0017, et surtout ce qu'elle n'ajoute pas.public.alertene pouvait pas servirAlerteOut: il manquait de quoi dire ce que l'alerte raconte, si elle est ouverte, et d'où elle vient. Trois colonnes —libelle,etat,cle_bronze— plus un index partiel sur les seules ouvertes.titre,descriptionetexigencene sont pas stockés, et c'est le point à contester si vous n'êtes pas d'accord. Ce sont des mises en forme, et la0012pose déjà la règle à propos du taux de charge : « le pourcentage est une mise en forme, elle appartient à l'affichage ». Les stocker ferait de chaque changement de formulation une migration.resolue_anon plus : rien ne résout d'alerte aujourd'hui, et une colonne toujours nulle est une promesse que personne ne tient — elle viendra avec ce qui les résoudra, comme au #164.2.
etatest dans ledo updatede l'upsert, ce qui est sans effet tant que la zone or ne porte que « ouverte ». Le jour où quelque chose résoudra les alertes, cette colonne devra en SORTIR, sinon un rejeu rouvrirait toutes les alertes fermées de la journée. Un cas de test porte la remarque à l'endroit où elle se lira.3. La limite de
COPY … PARTITION_BY (dt)sur zéro ligne. Sans valeur dedt, DuckDB ne crée pas de répertoire : une journée qui passerait de N alertes à zéro garderait sa partition or précédente. Le cas est théorique — une alerte ne disparaît de bronze qu'avec la rétention de 180 jours, qui emporte la journée entière — mais il est réel, et la zone argent ne l'a pas, elle écrit à un chemin nommé. Écrit dans le module et gardé par un cas, plutôt que découvert un soir de démonstration.4. Le contrôle des énumérations fait doublon avec celui de la zone argent, délibérément, comme
agregation._controler_enumerationsle fait pour la mesure que la zone argent produit pourtant. Une partition argent peut venir d'une version antérieure du job ou d'un rattrapage à la main.Ce que cette demande ne fait pas
public.previsionetpublic.recommandationrestent vides : ce sont le #37 et l'écriture en base des règles du #154. Et rien ne tourne encore en cron — c'est la #159.Relu sur
c5ff5bc. Chaîne verte (5/5), et rejoué ici pour ne pas croire la seule chaîne :pytest tests/unit→ 693 passés,ruff checketruff format --checksurservices packagespropres,mypy --config-file etl/pyproject.toml etlen strict sans erreur.Approuvé. Les quatre points que tu mets en avant tiennent. Un cinquième était à corriger, il l'est.
Ce que j'ai poussé —
c5ff5bctest_le_numero_suit_le_dernier_appliquefinissait surassert numeros[-1] == 18. Ce cas-là ne gardait pas la0018: il aurait rougi à la première0019du dépôt, sur un autre ticket, sans que rien ne soit cassé — et le runner est unique pour tout le groupe, donc la panne se paie en file d'attente pour tout le monde, en semaine de livraison.Remplacé par la dépendance réelle : la
0018complète la table de la0012, son numéro doit lui être supérieur (int(MIGRATION.name[:4]) > 12). Les doublons de numéro restaient de toute façon gardés partest_migrations_zone_or.test_la_serie_des_migrations_ne_porte_ni_doublon_ni_desordre, qui exprime déjà sa borne comme une dépendance (> 7) et pas comme une fin de série. Vérifié en posant une0019_bidon.sqlà côté : le cas passe encore.Au passage, le docstring du fichier annonçait « La 0017 », numéro que ton dernier commit a rendu à la #36.
Sur tes quatre points
1. La migration, et ce qu'elle n'ajoute pas. D'accord, y compris sur le refus de
titre,descriptionetexigence: la0012pose la règle etAlerteOutles compose.resolue_ade même — la contraintecheck (etat in ('ouverte', 'resolue'))porte déjà le futur cycle sans colonne toujours nulle. La contrainte posée hors de l'add columnest le motif de la0010, et un cas le garde explicitement : bien vu, c'est le genre d'oubli qui ne se voit jamais.2.
etatdans ledo update. D'accord, ettest_l_etat_est_mis_a_jour_par_le_rejeuporte la remarque au bon endroit : le jour où quelque chose résoudra les alertes, c'est ce cas qui rougira, pas la production.3.
COPY … PARTITION_BY (dt)sur zéro ligne. La limite est réelle, et la distinction que tu tiens entre « pas de partition argent » (#165 antérieur) et « partition argent vide » est celle qui compte — les deux cas de test la portent séparément. Rien à ajouter.4. Le doublon du contrôle d'énumérations. Justifié : la zone or ne charge pas en base ce que la base rejetterait, quelle que soit la version du job qui a écrit la partition argent. Même raison qu'
agregation._controler_enumerations.Vérifié aussi, puisque le chargement entre dans la transaction de la série :
COLONNES_ALERTEcouvre exactement les colonnes de la0012complétée par la0018, sansalerte_id— etpublic.alerten'a pas d'execution_id, donc rien ne manque. L'upsert porte bien la clé unique. La contrainte de clé étrangère sursite_idn'ouvre pas de nouveau risque :silver/job.pyconstruit ses lignes parsites[alerte.site_id], donc les alertes chargées viennent des sites du référentiel, comme les mesures.Deux remarques non bloquantes, pour la suite
dashboard/repository.py:67rend toujoursfixtures.ALERTES, et ce lot ne touche passervices/api. Il rend la donnée disponible danspublic.alerte— le branchement reste à faire. À ne pas cocher l'EF-05 de bout en bout sur cette base au moment du bilan.libelleest nullable,AlerteOut.descriptionne l'est pas (schemas.py:212,models.py:206). Le branchement devra donc composer un repli quand la source n'a pas de phrase — ce que ton commentaire de migration annonce déjà (« l'écran affiche un libellé générique reconstruit à partir du type »). Autant que le ticket du branchement le dise, plutôt que de le redécouvrir devant unValidationError.Un point de procédure, pas de code
Ta case « @lenaic la relecture est obligatoire :
db/est à toi dansCODEOWNERS» n'est pas cochée, et la forge ne l'a pas ajouté comme relecteur — la demande n'a que moi.CODEOWNERSle dit lui-même : le fichier seul ne bloque rien tant que « relecture des Code Owners requise » n'est pas mise dans la protection dedevelop, et elle ne l'est pas. La forge laissera donc passer.Mon approbation porte sur la zone or, le chargement et la migration, que j'ai relus et rejoués. Elle ne remplace pas l'aval du propriétaire de
db/voulu par la réunion du 31/08 (§7) : c'est à trancher avant la fusion, pas après.