Étiqueter les événements de progression par run pour filtrer les retardataires

This commit is contained in:
Antoine Jacquin
2026-09-18 21:10:31 +02:00
parent ecd21d5b46
commit fbb56936f8
3 changed files with 46 additions and 13 deletions

View File

@ -12,6 +12,7 @@ ajout (une ligne < 4 Ko avec O_APPEND est atomique sur POSIX).
"""
import json
import os
import re
import time
from pathlib import Path
@ -54,6 +55,9 @@ def report_event(output_dir, tile, phase, state, detail=None, res=None):
(ProcessPoolExecutor, 'spawn') ne partagent aucun descripteur de fichier.
"""
event = {"ts": round(time.time(), 3), "tile": tile, "phase": phase, "state": state}
run_id = os.environ.get("LIDAR_RUN_ID")
if run_id:
event["run"] = run_id
if detail is not None:
event["detail"] = detail
if res is not None:
@ -149,6 +153,15 @@ def aggregate_tiles(events, viz_labels=None):
return result
def progress_snapshot(output_dir, viz_labels=None):
"""État consolidé des tuiles du dernier run (prêt pour /api/status)."""
return aggregate_tiles(read_events(output_dir), viz_labels=viz_labels)
def progress_snapshot(output_dir, viz_labels=None, run_id=None):
"""État consolidé des tuiles du dernier run (prêt pour /api/status).
run_id (LIDAR_RUN_ID posé par la webapp) : ne garde que les événements de
CE run — les workers d'un run annulé peuvent continuer d'écrire (O_APPEND)
après la troncature du journal par le run suivant, et pollueraient sinon
la file affichée. Sans run_id (run CLI autonome) : tout le journal.
"""
events = read_events(output_dir)
if run_id is not None:
events = [ev for ev in events if isinstance(ev, dict) and ev.get("run") == run_id]
return aggregate_tiles(events, viz_labels=viz_labels)