STUD-1157 — service-tableau : POST et GET /api/erreurs-page, journal tournant des erreurs de la page #1642
Loading…
Reference in a new issue
No description provided.
Delete branch "hermes/stud-1157-backend-erreurs"
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 la carte livre
Deux routes nouvelles sur
service-tableau(Rust,_tableau/rust) : unPOSTqui reçoit les erreurs de la page et les écrit dans un journal tournant, unGETqui rend les 24 dernières heures pour l'onglet Processus.Nouvelle route :
/api/erreurs-page(contrat pour le front)POST /api/erreurs-page— corps JSON, tel que l'envoiefront/src/lib/erreurs-navigateur.js:Réponses :
200 {"ok":true}écrit ;200 {"ok":true,"doublon":true}si la même erreur du même client vient d'être écrite ;400corps illisible, message vide, ou champ reconnu qui n'est pas du texte ;429au onzième envoi de la minute ;500journal non écrit, avec la raison en clair.GET /api/erreurs-page— les 24 dernières heures, regroupées par message (clé du front : espaces comprimés, minuscules), le plus récent d'abord :Le journal est
/opt/studio/journaux/erreurs-page.jsonl(SERVICE_JOURNAL_ERREURSpour le déplacer), une ligne JSON par erreur,quand(ISO 8601 UTC) etts. Aucune clé hors des six ci-dessus n'est écrite — donc aucun secret, et l'adresse du client (qui sert à la limite et au dédoublonnage) n'est jamais écrite. Tournant passé 4 Mo : les 10 000 dernières lignes restent, réécrites par renommage.Preuves
La panne d'avant, mesurée : sur le binaire d'
origin/main(c5e7c4a2), lancé :Le banc rejoué sur
origin/mainéchoue de la même façon (405 lecture seule), et passe sur la branche.Sur la branche, même binaire, mêmes commandes :
cargo test --release --locked(branche, commitab165f74) : 53 cas, 0 échec, code 0, dont les 4 nouveaux deservice/tests/erreurs_page.rs, qui lancent le vrai binaire et lui parlent par TCP (écriture du journal, regroupement du GET, corps lu même envoyé en deux paquets, refus des corps qui ne sont pas des erreurs, limite de dix par minute).cargo build --release --locked: code 0, aucun avertissement.python3 _tableau/garde_fous.py: « garde-fous : rien à redire », code 0.python3 _tableau/test_deployer_rust.py: « tous les cas tiennent », code 0. Doc : section datée en fin de_tableau/LXC-132.md.Ce qui n'est pas mesuré
erreurs.rs, pas par le banc de bout en bout : la provoquer coûterait des mégaoctets pour rien.t_3ec43777).Un trou mesuré, hors de cette carte
Le service n'écoute que sur la boucle locale du 132 (
127.0.0.1:8096) ; la page, elle, est servie par le serveur Python du 8080, qui relaie.serveur_processus.concerne('/api/erreurs-page')rend False (mesuré) etdo_POSTretombe surrecevoir_actualiser, qui répond404à tout chemin hors/actualiser*(lu dansserveur_actualiser.py). Sans un relais du POST en Python, l'erreur du navigateur n'arrive jamais au service : c'est une livraison à part, signalée en commentaire de la carte et confiée au profiltableau.Collisions
_tableau/rust/service/src/main.rsest aussi touché par la PR #1623 (hermes/stud-1157-rust-logs, ouverte) : rebasé ici surorigin/mainc5e7c4a2, aucun conflit à ce jour. La deuxième fusion devra être rebasée._tableau/LXC-132.mdest aussi touché par la PR #1623 et la PR #1624 : ma section est ajoutée en fin de fichier, loin de leurs insertions, pour rester fusionnable.fusion-auto: pas de fusion, la PR est en conflit avec main : à rebaser. Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.ab165f749bc64a1ba572Rebasage sur
main4334b8da(carte t_b6a7239d) — conflits resolus en gardant les deux cotes.Tete :
c64a1ba5(etaitab165f74).cargo test --release --locked: 88 cas, 0 echec (53 avant rebasage).cargo build --release --locked: code 0, aucun avertissement.python3 _tableau/garde_fous.py: « rien a redire ». CI pc-studio 4/4 verte.mergeable=true, etiquetteconflitretiree.Decisions de resolution :
service/src/main.rs: l'architecture de main (lecture bornee,atelier::Demande, aiguillage surdem.methode/dem.chemin) accueille le journal et les deux routes, servies d'un bloc parerreurs::servir. Les helpers d'ecriture d'une reponse (repondre,ecrire,lecture_seule,SERVEUR) passent dansservice/src/http.rs: sans eux,main.rs(591 lignes dansmain) franchissait le plafond de 600 lignes du garde-fou.service/src/erreurs.rs:servir,CORPS_MAX,Journal::depuis_envrejoignent le module.service/src/lib.rs: modules de main (conso, replis, top, videos) pluserreursethttp._tableau/LXC-132.md: les deux sections sont gardees (le relais Python apporte parmain, le service de cette branche) ; rien n'est retire demain.Ordre des fusions (decision du chef, 2026-10-14) : #1623 devait fusionner d'abord. Mesure :
main4334b8dane contient pascollecteur::erreurs; la PR #1623 est elle-meme en conflit (mergeable=false), sans carte de rebasage. J'ai donc rebase sur lemaincourant. Consequence : #1623 devra se rebaser apres #1642, et l'homonymiecollecteur::erreurs/service::erreurssera a arbitrer la-bas — deux crates distinctes, donc aucun renommage necessaire ici (il n'y a queservice::erreursdans cette tete).python3 _tableau/lancer-tests.py --tout: 170 bancs verts, 1 rouge (test_accueil_parite.py) et le cliquet de couverture en baisse (coeur 99,1 % < 99,4 %, ensemble 96,7 % < 99,0 %) — les deux rejoues a l'identique surmain4334b8da(banc inchange,couverture-objectif.jsonidentique) : pre-existants, hors de cette carte.Fusionnée automatiquement par
fusion-auto(forge) : CI verte (Rust et Front Svelte), PR relue (étiquetterelu), sans conflit.