Add retry_tail_analysis/src/retry_tail_analysis/cli.py
This commit is contained in:
parent
2242d66b8c
commit
e93f453f68
1 changed files with 60 additions and 0 deletions
60
retry_tail_analysis/src/retry_tail_analysis/cli.py
Normal file
60
retry_tail_analysis/src/retry_tail_analysis/cli.py
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
import argparse
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
from retry_tail_analysis.core import analyze_retry_tail, ExperimentData
|
||||
|
||||
|
||||
def _load_experiment_data(file_path: Path) -> List[ExperimentData]:
|
||||
"""Lädt und validiert Experimentdaten aus einer JSON-Datei."""
|
||||
if not file_path.exists() or not file_path.is_file():
|
||||
raise FileNotFoundError(f"Eingabedatei nicht gefunden: {file_path}")
|
||||
|
||||
with file_path.open(encoding="utf-8") as f:
|
||||
try:
|
||||
raw_data = json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
raise ValueError(f"Fehler beim Lesen der JSON-Datei: {e}") from e
|
||||
|
||||
if not isinstance(raw_data, list):
|
||||
raise ValueError("Erwartet eine Liste von Experimentobjekten im JSON.")
|
||||
|
||||
data_objects = []
|
||||
for idx, entry in enumerate(raw_data, start=1):
|
||||
if not isinstance(entry, dict):
|
||||
raise TypeError(f"Eintrag {idx} ist kein Objekt: {entry}")
|
||||
required_fields = {"run_id", "retry_tailp99", "threshold"}
|
||||
if not required_fields.issubset(entry.keys()):
|
||||
missing = required_fields - set(entry.keys())
|
||||
raise ValueError(f"Fehlende Felder in Eintrag {idx}: {missing}")
|
||||
try:
|
||||
run_id = str(entry["run_id"])
|
||||
retry_tailp99 = float(entry["retry_tailp99"])
|
||||
threshold = float(entry["threshold"])
|
||||
except (ValueError, TypeError) as e:
|
||||
raise ValueError(f"Ungültige Typen in Eintrag {idx}: {e}") from e
|
||||
data_objects.append(ExperimentData(run_id, retry_tailp99, threshold))
|
||||
assert data_objects, "Keine gültigen Experimentdaten gefunden."
|
||||
return data_objects
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""CLI-Einstiegspunkt: führt die Analyse basierend auf JSON-Input aus."""
|
||||
parser = argparse.ArgumentParser(description="Analyse der retry_tailp99-Werte aus JSON-Experimentdaten.")
|
||||
parser.add_argument("--input", required=True, help="Pfad zur JSON-Datei mit Experimentdaten.")
|
||||
args = parser.parse_args()
|
||||
|
||||
input_path = Path(args.input)
|
||||
try:
|
||||
data = _load_experiment_data(input_path)
|
||||
result = analyze_retry_tail(data)
|
||||
print(f"Aggregierter retry_tailp99-Wert: {result:.4f}")
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(f"Fehler: {exc}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Reference in a new issue