etl : la chaîne passe aux dix minutes, l'agrégat continu suit (#246) #248
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!248
Loading…
Reference in a new issue
No description provided.
Delete branch "olivier/246-cadence-dix-minutes"
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?
Ferme #246.
Ce que ça change
La chaîne ETL passe du quart d'heure aux dix minutes, et l'agrégat continu suit dans le même lot. L'âge de la dernière minute dans
public.mesure— ce que le pavé « état des sites » affiche — tombe de 28-87 minutes à 6-15, et le seau horaire devient lisible à(H+1):10.mesure_horaire:00:17:27:00 :15 :30 :45+3+8:00 :10 :20 :30 :40 :50+3+5Les trois minutes derrière l'argent ne bougent pas. C'est la marge la plus serrée de la chaîne — la passe de 00:00, qui clôt la veille, écrit 1 440 minutes × 7 sites, soit ~1 min sur les 28 s mesurées pour une demi-journée — et la seule que le verrou de la zone or ne couvre pas. Les minutes ont donc été prises sur l'écart or → chargement, que le verrou couvre, ramené de cinq à deux.
Ce que ça ne fait pas, et il faut le lire avant d'approuver
Ce n'est pas du temps réel, et le mot n'apparaît nulle part dans le lot : c'est une chaîne par lots dont le lot fait dix minutes. Une minute est prise par la première passe argent strictement postérieure (la grille s'arrête aux minutes révolues), puis écrite par le chargement cinq minutes plus tard : d'où 6 au mieux, 15 au pire, 10 en moyenne. Un plafond ferme à dix minutes demanderait une cadence de cinq.
Et dix minutes est le plancher de la forme actuelle. La passe argent relit la journée entière à chaque tour —
chargerénumère les deux endpoints de bronze par site et par jour, elle ne traite pas l'incrément. Six passages par heure portent la lecture de bronze à ~6 min/h. Descendre à cinq minutes demande de la rendre incrémentale, et de le mesurer d'abord ; ça n'est pas fait ici et ne doit pas l'être en resserrant les minutes.Trois erreurs trouvées en route
1. La cadence était écrite à un second endroit, et le rebasage ne pouvait pas le voir. Le #244 (fusionné pendant que j'écrivais ce lot) fait publier par chaque lanceur son intervalle de crontab via
ops_publier_resultat→ev_ops_tache_cadence_secondes. Les trois de l'ETL déclaraient encore900. Le rebasage est passé sans conflit : deux modifications du même fichier à des endroits différents. Le tableau de bordetldivise l'âge de la dernière réussite par cette valeur, et l'alerte du #228 se déclenche au-delà de trois fois — une valeur périmée ne casse rien de visible, elle desserre l'alerte en silence : 45 minutes de chaîne arrêtée tolérées au lieu de 30. Corrigé, et le banc contrôle désormais les sept tâches, crontab contre valeur déclarée.2. La borne d'attente du verrou valait 900 s. Posée pour une chaîne horaire (« un quart de la cadence », dit son commentaire), jamais suivie au passage au quart d'heure : elle dépassait alors la cadence entière, soit exactement l'empilement de processus qu'elle empêche. Elle passe à 150 s.
3. Un commentaire de
taches_planifieesétait faux dans ses deux moitiés. Il affirmait que la passe de minuit « sort sans rien écrire, quatre fois par jour au quart d'heure ». Vérifié dans le code :_jour_demandela fait basculer sur la veille, qu'elle clôt — elle écrit 1 440 minutes, c'est la passe la plus lourde du jour. Le garde-fou visé n'est atteint que par un--jourexplicite, et une seule passe par jour tombe à 00:00, quelle que soit la cadence.Le banc ne code plus la cadence en dur
Le #205 avait écrit le quart d'heure à trois endroits de
test-fraicheur-chaine.sh— nombre de passes, borne de politique en(minute / 15 + 1) * 15, etinterval '15 minutes'attendu — qu'il fallait réécrire ensemble. Il nommait aussi0020_fraicheur_zone_or.sqlen dur : il serait resté vert sur une politique périmée, puisque chaque migration retire la précédente. Désormais il lit la cadence danstaches_planifiees, vérifie qu'elle est régulière (six passes groupées dans la première minute donnaient une cadence apparente de dix), prend la dernière migration qui pose une politique, et y confronte les deux réglages.Contre-épreuves jouées : crontab seule ramenée au quart d'heure → rouge ; politique seule → rouge ;
0022retirée, la0020redevient la dernière → rouge ; six passes dans la première minute → rouge.Vérifications
Toutes jouées sur
services/api/.venv(3.14,duckdb+psycopgprésents) et avec l'outillage épinglé derequirements-ci.txt.Non vérifié : rien sur la machine. Le lot ne modifie que des déclarations — crontab, politique, documentation — et sa preuve réelle est le relevé d'après déploiement, écrit dans #246.
⚠️ La chaîne sortira rouge, et pas à cause de ce lot
shellcheck tests/ci/*.shremonte SC2034 surtests/ci/test-supervision.shligne 495, fichier du #244 que ce lot ne touche pas. Le constat est présent surdevelop(vérifié surorigin/develop), doncdevelopest déjà rouge à cette étape.C'est un faux positif :
OPS_TEXTFILE_DIRest bien lu, par une fonction du fichier chargé dynamiquement (# shellcheck disable=SC1090), et les assertions du banc le prouvent en passant. Un# shellcheck disable=SC2034suffit. Je ne l'ai pas fait ici : c'est le fichier du #244 et ça n'a rien à voir avec la cadence. À traiter dans un lot d'une ligne, chez son auteur.Déploiement
L'ordre n'est pas indifférent : la crontab d'abord, la politique ensuite. Les deux voyagent dans le même lot et
--tags apples pose ensemble ; la migration passe au démarrage de l'API. Le premier contrôle après déploiement verra encore l'ancien retard — la migration ne peut pas appelerrefresh_continuous_aggregate(il refuse de tourner dans une transaction), le rattrapage a lieu au premier passage de la politique, dix minutes plus tard au pire.Rappel : la machine a deux cadences de retard, le quart d'heure du #205 n'ayant jamais été déployé. C'est ce déploiement qui rendra les 1 h → 10 min visibles, pas la fusion.
Retour arrière en fin de
0022, et il se joue avec celui detaches_planifiees: les deux moitiés se défont ensemble, sans quoi le banc refuse le dépôt.🤖 Generated with Claude Code
Verdict de la chaîne sur
fb5a5b11Les deux rouges sont ceux de
develop, et ce lot n'en ajoute aucun. Vérifié sur le commitb5667d6dedevelop, enpush, avant que cette branche existe : le même couple échoue, exactement. L'ensemble des échecs est donc identique, et cette PR ajoute en plus un job quedevelopne joue pas — « Infra Ansible », filtré par chemin — qui est vert..tf,docker-composeniDockerfile.shellcheckremonte SC2034 surtests/ci/test-supervision.sh:495, fichier du #244 (PR #245) que ce lot ne touche pas. C'est un faux positif —OPS_TEXTFILE_DIRest bien lu, par une fonction du fichier chargé dynamiquement (# shellcheck disable=SC1090), et les assertions du banc le prouvent en passant. Un# shellcheck disable=SC2034suffit.⚠️ Et ce rouge en cache deux contrôles non joués. Dans ce job, les étapes sont séquentielles sous
sh -e: l'échec deshellchecklaisse yamllint et zizmor à l'état « ignoré ». Ne pas lire ce job comme « seul shellcheck a un reproche ». Les deux ont été joués localement sur ce lot, à l'outillage épinglé derequirements-ci.txt:Aucun des deux échecs n'appartient à ce ticket, et je ne les ai pas corrigés ici — mêler un correctif de chaîne à un changement de cadence rendrait la relecture moins claire, et le second appartient à l'auteur du #244. Ils bloquent en revanche la fusion de toute PR : ils méritent leur propre ticket.
🤖 Generated with Claude Code
Verdict sur
4c08c290— un des deux rouges est levéfb5a5b14c08c290Ce que le correctif shellcheck a débloqué, au-delà de son propre rouge. Dans ce job les étapes sont séquentielles sous
sh -e: l'échec deshellchecklaissait yamillint et zizmor à l'état « ignoré ». Deux audits ne tournaient plus, et le rapport ne le disait pas en ces termes. Ils tournent de nouveau, et ils passent — ce vert n'est donc pas « shellcheck corrigé », c'est « les trois étapes jouées ». Les deux avaient été rejoués en local avant la poussée, à l'outillage épinglé de.forgejo/requirements-meta.txt(yamllint 1.38.0,zizmor 1.30.0), avec les arguments exacts de la chaîne : code 0 des deux côtés,No findings to reportpour zizmor.Checkov n'est pas traité ici, et c'est une décision, pas un oubli
Rejoué en local avec le checkov épinglé (
3.3.16) : 8 constats, tous surazurerm_storage_account.archive. Six sont inapplicables et le dépôt écrit déjà pourquoi. Deux sont de vrais manques — suppression réversible (CKV2_AZURE_38) et politique d'expiration des SAS (CKV2_AZURE_41).Deux règles écrites du dépôt interdisent de les traiter dans cette demande :
docs/runbooks/stockage-secours.md, § « Activer la suppression réversible » : « c'est une décision à prendre, pas un oubli. […] À ouvrir en ticket plutôt qu'à glisser dans une demande de fusion qui parle d'autre chose. »infra/terraform/.checkov.yml, en capitales : « CE QUI N'EST PAS UNE EXCEPTION ACCEPTABLE : ça fait rougir la chaîne. »Rendre Checkov vert ici demandait donc soit d'enfreindre la première, soit d'exempter deux manques que
stockage.tfsignale lui-même comme « une décision à prendre ». D'où #249, qui porte les huit constats, l'argument vérifiable de chacun des six, et la mesure préparatoire : les deux correctifs Terraform essayés en local font passer 8 → 6, les six restants étant exactement les inapplicables.Ce lot ne touche aucun fichier de
infra/terraform/— ni.tf, ni.checkov.yml.Ce rouge est celui de
develop: cette demande n'ajoute aucun échec, et elle en retire un.🤖 Generated with Claude Code