Add artifact.data_logger/src/artifact_data_logger/cli.py

This commit is contained in:
Mika 2026-04-03 10:57:06 +00:00
parent ac5ede1aef
commit 63979723fe

View file

@ -0,0 +1,60 @@
import argparse
import json
import sys
from pathlib import Path
from datetime import datetime
from rich.console import Console
# Lokaler Import des Moduls, das log_metrics enthält
from artifact_data_logger.core import log_metrics
def main() -> None:
"""CLI-Interface zum Protokollieren von Mix-Freeze-Metriken.
Liest Argumente --run-id und --metrics-file, validiert Eingaben,
lädt JSON-Inhalt und ruft log_metrics(run_id, metrics) auf.
"""
parser = argparse.ArgumentParser(description="Mix Freeze Metric Logger CLI")
parser.add_argument("--run-id", required=True, help="Kennung des Runs (z. B. '40')")
parser.add_argument(
"--metrics-file", required=True, help="Pfad zur JSON-Datei mit Preflight-Metriken."
)
args = parser.parse_args()
console = Console()
run_id: str = args.run_id.strip()
metrics_path = Path(args.metrics_file)
# Validation: Existenz und Struktur prüfen
if not metrics_path.exists():
console.print(f"[red]Fehler:[/red] Metrics-Datei '{metrics_path}' nicht gefunden.")
sys.exit(1)
try:
with metrics_path.open("r", encoding="utf-8") as f:
metrics = json.load(f)
except json.JSONDecodeError as err:
console.print(f"[red]Fehler beim Einlesen von JSON:[/red] {err}")
sys.exit(2)
# Simple structure validation (input_validation_required)
required_keys = {"setup_fingerprint", "policy_hash", "epoch_ms", "near_expiry_unpinned"}
missing = required_keys - metrics.keys()
if missing:
console.print(f"[red]Fehlende Schlüssel im Metrics-JSON:[/red] {', '.join(missing)}")
sys.exit(3)
# Lauf-Startzeit für Nachvollziehbarkeit
console.print(f"[green]Starte Logging für Run {run_id} um {datetime.utcnow().isoformat()}Z[/green]")
try:
log_metrics(run_id, metrics)
except Exception as exc:
console.print(f"[red]Fehler beim Loggen der Metriken:[/red] {exc}")
sys.exit(4)
if __name__ == "__main__":
main()