"""Measured benchmarks (no fabricated numbers): API lookup latency, job throughput, page response. AKOS_URL=… AKOS_TOKEN=… python scripts/bench.py [--n 50] [--jobs 20]""" import argparse, json, os, statistics, sys, time sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) from akos.sdk import Akos ap = argparse.ArgumentParser(); ap.add_argument("--n", type=int, default=50); ap.add_argument("--jobs", type=int, default=20); a = ap.parse_args() A = Akos() def timed(fn, n): ts = [] for _ in range(n): t0 = time.perf_counter(); fn(); ts.append((time.perf_counter() - t0) * 1000) return {"n": n, "p50_ms": round(statistics.median(ts), 1), "p95_ms": round(sorted(ts)[int(0.95 * (n - 1))], 1), "max_ms": round(max(ts), 1)} out = {"target": A.url, "when": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())} out["search_lookup"] = timed(lambda: A.search("exchange rates", 10), a.n) pk = A.packages()[0]["id"] out["akp_inspect"] = timed(lambda: A.package(pk), a.n) out["overview_page_api"] = timed(lambda: A.status(), a.n) import httpx out["ui_index_html"] = timed(lambda: httpx.get(A.url + "/", timeout=30).raise_for_status(), a.n) out["health"] = timed(lambda: A.health(), a.n) t0 = time.perf_counter() ids = [A._req("POST", "/jobs/enqueue-bench", json={}) if False else None for _ in range(0)] # job throughput: enqueue N maintenance jobs through the ops path (admin) and wait for completion import asyncio jobs = [] for i in range(a.jobs): r = A._req("POST", "/ops/backup") if False else None # use drift_check on a tested version as a representative worker job v = next((p for p in A.packages() if p["lifecycle"] in ("tested", "registered", "monitored")), None) if v: api = A.api(v["api_id"]); vid = api["current_version_id"] t0 = time.perf_counter() for i in range(a.jobs): jobs.append(A._req("POST", "/drift/check", json={"api_version_id": vid})["job_id"]) for j in jobs: A.wait_job(j, timeout=600) el = time.perf_counter() - t0 out["job_throughput"] = {"jobs": a.jobs, "kind": "drift_check (live provider call + schema validation)", "elapsed_s": round(el, 2), "jobs_per_min": round(a.jobs / el * 60, 1)} print(json.dumps(out, indent=1))