Add hotspot_logging/src/hotspot_logging/cli.py
This commit is contained in:
parent
f636177eae
commit
e68e24731e
1 changed files with 52 additions and 0 deletions
52
hotspot_logging/src/hotspot_logging/cli.py
Normal file
52
hotspot_logging/src/hotspot_logging/cli.py
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
from hotspot_logging.core import log_hotspot_ratio
|
||||||
|
|
||||||
|
def _validate_input_data(data: Any) -> bool:
|
||||||
|
if not isinstance(data, list):
|
||||||
|
raise ValueError("Input JSON must be a list of objects.")
|
||||||
|
for entry in data:
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
raise ValueError("Each entry must be a dictionary.")
|
||||||
|
for field in ("time_window", "near_expiry_jobs", "total_jobs"):
|
||||||
|
if field not in entry:
|
||||||
|
raise ValueError(f"Missing required field '{field}' in entry.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
parser = argparse.ArgumentParser(description="Log hotspot ratios per time window.")
|
||||||
|
parser.add_argument("--input", required=True, help="Path to the input JSON file with job metrics.")
|
||||||
|
parser.add_argument("--output", required=True, help="Path to the output JSON log file.")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
input_path = Path(args.input)
|
||||||
|
output_path = Path(args.output)
|
||||||
|
|
||||||
|
if not input_path.exists():
|
||||||
|
raise FileNotFoundError(f"Input file not found: {input_path}")
|
||||||
|
|
||||||
|
with input_path.open("r", encoding="utf-8") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
_validate_input_data(data)
|
||||||
|
|
||||||
|
# Ensure output directory exists
|
||||||
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Redirect log output to the output file via a context
|
||||||
|
import sys
|
||||||
|
from contextlib import redirect_stdout
|
||||||
|
|
||||||
|
with output_path.open("a", encoding="utf-8") as outfile, redirect_stdout(outfile):
|
||||||
|
for entry in data:
|
||||||
|
time_window = float(entry["time_window"])
|
||||||
|
near_expiry_jobs = int(entry["near_expiry_jobs"])
|
||||||
|
total_jobs = int(entry["total_jobs"])
|
||||||
|
assert total_jobs >= 0, "Total jobs must be non-negative."
|
||||||
|
assert near_expiry_jobs >= 0, "Near-expiry jobs must be non-negative."
|
||||||
|
log_hotspot_ratio(time_window, near_expiry_jobs, total_jobs)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Loading…
Reference in a new issue