[infra] Le job silver n'est planifié nulle part, et ne pourrait pas l'être en l'état #136
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
1 participant
Notifications
Due date
No due date set.
Depends on
Reference
g2/enervision#136
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Exigence couverte
ENF-08, EF-04
Épreuve servie
EC04 · Cloud et sécurisation
Charge estimée
0,5 j.h
Ce qu'on veut obtenir
Le job de la zone argent n'est appelé par rien, et une ligne de crontab posée aujourd'hui échouerait à chaque passage. Trois obstacles, dont deux invisibles tant qu'on ne cherche pas.
1. Le lanceur ignore le python du venv.
services/etl/bin/silver-daily.shfaitexec python3, là oùcollecte-current.shfaitexec "${ENERVISION_PYTHON:-python3}". Sur le serveur :C'est le mode de panne relevé par Olivier en relecture de la #114 pour le collecteur, reproduit à l'identique dans le lanceur de l'ETL : la tâche sort en erreur chaque heure sans rien dire d'utile.
2. La tâche Ansible code le service en dur. « Planifier les relèves que le dépôt fournit » construit son chemin avec
services/collector/bin/{{ item.script }}, et la tâche destatqui la précède fait pareil. Le lanceur silver vit dansservices/etl/bin/. On ne peut donc pas l'ajouter àcollector_tachesen l'état. Ce chemin était juste tant qu'il n'y avait que des collecteurs, il ne l'est plus.3. Aucune planification n'existe. Vérifié sur le serveur : crontabs de
root,deployetlenaic,/etc/crontab,/etc/cron.d,/etc/cron.hourly,/etc/cron.daily, minuteries systemd et unités nommées. Seules les deux lignes du collecteur existent. Rien pour l'ETL.Conséquence directe : le seau
silverest à 0 objet alors que le code du #34 est fusionné et déployé, et que bronze contient 9090 objets.Critères d'acceptation
silver-daily.shhonoreENERVISION_PYTHONcomme les lanceurs du collecteur, et sort en erreur explicite si l'interpréteur n'a pas ses dépendances plutôt que de lever une trace brute.deployavecENERVISION_RACINEet le python du venv, sa sortie dans{{ collector_log_dir }}/silver.log.tests/ci/test-role-app.yml, gagne un contrôle qui échoue si le chemin du service redevient codé en dur.silvercontient la partition du jour.Comment on le vérifie
Commande sudo crontab -u deploy -l
Attendu trois lignes, dont silver, avec ENERVISION_PYTHON renseigné
Commande mc ls --recursive ev/silver/
Attendu les trois tables Parquet de la partition du jour
Commande le déploiement rejoué une seconde fois
Attendu aucune ligne dupliquée, aucune tâche en changed sur la planification
Manuel d'exploitation à mettre à jour
docs/runbooks/etl.mds'il existe, sinon la section ETL du manuel d'exploitation : où va le journal, comment rejouer une journée à la main, et comment lire un refus du garde-fou sans le confondre avec une panne.Risque et retour arrière
Risque faible. La modification touche la planification et un lanceur, pas la transformation elle-même. Le pire cas est une tâche horaire qui échoue et remplit
silver.log, déjà couvert par la rotation*.logen place.Retour arrière : passer l'entrée silver à
state: absentdans la liste des tâches et rejouer le rôle retire la ligne, sans toucher aux deux du collecteur.Dépendance : l'horaire retenu dépend du #135. Tant qu'il n'est pas corrigé, une tâche horaire sur la journée courante refusera avant 17 h. On peut poser la planification quand même, la sortie du job est explicite, mais le journal portera des refus qu'il ne faudra pas lire comme des pannes.
Traité par la #143, poussée et en attente de relecture. À fusionner après
la #142, dont l'entrée de crontab suppose la correction de la grille.
Les trois obstacles sont levés. Le banc du rôle gagne un contrôle sur le chemin
du lanceur, éprouvé dans les deux sens : vert sur le rôle corrigé, rouge sur le
chemin en dur réintroduit.
Une précision qui vaut d'être notée, parce qu'elle m'a fait écrire deux fois le
même préflight. J'avais remplacé
import duckdb, miniopar unimport etl.silver.jobplus général : ça ne marche pas,entrepot.pyimporteces deux modules tardivement pour que les tests unitaires tournent sans le
SDK. Importer le module réussit donc sans eux, et on retombe sur la trace brute.
Le contrôle explicite est délibéré, et le commentaire du script le dit.
La chaîne est rouge sur cette demande, mais pour le #147.
Fusionné par la #143 et déployé. Quatre critères sur six sont prouvés, les
deux autres attendent la passe de 10 h 00 UTC et un second déploiement.
Avant et après, sur le serveur
Critère 3, la ligne posée
Sous
deploy, avec la racine et le python du venv, la sortie dans son journal.Critère 1, le lanceur
Éprouvé dans les deux sens avant fusion : code 3 avec un interpréteur sans
les dépendances, silencieux avec le bon.
Les deux dépendances sont nommées explicitement, et c'est délibéré :
entrepot.pyimporte minio et duckdb tardivement, pour que les testsunitaires tournent sans le SDK. Un
import etl.silver.jobplus général réussitdonc sans eux. J'avais écrit cette version là d'abord, le banc local l'a montrée
inopérante.
Critère 2, le rôle ne suppose plus le service
Critère 5, le banc
Vert sur le rôle corrigé, rouge sur le chemin en dur réintroduit, et la
chaîne le joue à chaque demande.
ansible-lintà 0 défaut en profil production.Ce qui reste
Critère 6 : la première passe planifiée tombe à 10 h 00 UTC. La preuve sera
l'existence de
/var/log/enervision/silver.logécrit par cron, et la partitiondu jour dans le seau
silver. Le lanceur déployé a déjà produit 3885 lignes enessai isolé, donc il n'y a pas de doute sur le résultat, seulement sur le
déclenchement.
Critère 4 : demande un second déploiement pour vérifier que les trois lignes
restent trois.
Critère 6 atteint. La première passe planifiée a tourné seule à 10 h 00 UTC.
/var/log/enervision/silver.log, écrit par cron, jamais à la main :Et la partition du jour dans le seau de production, qui était à 0 objet
depuis le déploiement du #34 :
4200 lignes, soit 7 sites × 600 minutes à 10 h 00 UTC. Le compte est juste.
Cinq sites sur sept à 100 % de disponibilité, aucun en dessous de 99,2 %.
La zone argent se remplit maintenant toute seule, toutes les heures.
Ce qui reste
Le critère 4 seul, qui demande un second déploiement pour vérifier que les
trois lignes de crontab restent trois. Il se cochera au prochain déploiement,
quel qu'il soit.
Une fausse alerte, pour mémoire
J'ai signalé ce matin que la passe « n'avait rien produit », en regardant à
09 h 37 UTC une tâche planifiée à 10 h 00. Il n'y avait rien à chercher.