Download scripts/run_abac_benchmark.py from yusufcalisir/Collaborative-Fraud-Intelligence-Simulator: direct link, hf CLI and curl.
- Browser
- Download file 2.84 kB
-
https://huggingface.co/spaces/yusufcalisir/Collaborative-Fraud-Intelligence-Simulator/resolve/main/scripts/run_abac_benchmark.py
- Command line
-
hf download hf://spaces/yusufcalisir/Collaborative-Fraud-Intelligence-Simulator/scripts/run_abac_benchmark.py
-
curl -L -o run_abac_benchmark.py https://huggingface.co/spaces/yusufcalisir/Collaborative-Fraud-Intelligence-Simulator/resolve/main/scripts/run_abac_benchmark.py
2.84 kB
| """Reproducible ABAC Engine Throughput and Decision Latency Benchmark Suite. | |
| Executes sustained access decision evaluations across representative banking tenant, | |
| shift-hour, and supervisory clearance policies to measure: | |
| - Decision throughput (requests/sec) | |
| - Mean and p99 decision latency (ms) | |
| """ | |
| from __future__ import annotations | |
| import statistics | |
| import sys | |
| import time | |
| from pathlib import Path | |
| # Add backend to sys.path | |
| backend_path = Path(__file__).resolve().parent.parent / "backend" | |
| if str(backend_path) not in sys.path: | |
| sys.path.insert(0, str(backend_path)) | |
| from app.infrastructure.security.abac_engine import ABACEngine, ABACResource | |
| from app.infrastructure.security.oidc_authenticator import UserClaims | |
| def run_abac_benchmark( | |
| iterations: int = 50000, | |
| warmup: int = 5000, | |
| ) -> dict[str, float]: | |
| """Measures in-memory ABAC policy decision throughput and latency percentiles.""" | |
| engine = ABACEngine() | |
| user = UserClaims( | |
| sub="usr-bench-01", | |
| username="investigator_alpha", | |
| bank_id="bank_a", | |
| roles=["analyst"], | |
| clearance_level=2, | |
| shift_hours="00:00-23:59", | |
| ) | |
| resource = ABACResource( | |
| resource_type="alert", | |
| resource_id="alt-bench-101", | |
| bank_id="bank_a", | |
| amount=5000.0, | |
| ) | |
| # 1. Warmup | |
| for _ in range(warmup): | |
| engine.evaluate_access(user, resource, action="read") | |
| # 2. Benchmark runs (3 rounds to ensure stability) | |
| latencies_us: list[float] = [] | |
| rounds_throughput: list[float] = [] | |
| for round_idx in range(1, 4): | |
| t0 = time.perf_counter() | |
| for _ in range(iterations): | |
| t_req_start = time.perf_counter() | |
| _ = engine.evaluate_access(user, resource, action="read") | |
| latencies_us.append((time.perf_counter() - t_req_start) * 1e6) | |
| elapsed = time.perf_counter() - t0 | |
| round_throughput = iterations / elapsed | |
| rounds_throughput.append(round_throughput) | |
| print(f"Round {round_idx}: {iterations:,} evaluations in {elapsed:.4f}s -> {round_throughput:,.0f} req/s") | |
| mean_throughput = statistics.mean(rounds_throughput) | |
| mean_latency_ms = (statistics.mean(latencies_us)) / 1000.0 | |
| p99_latency_ms = (statistics.quantiles(latencies_us, n=100)[98]) / 1000.0 | |
| print("=" * 60) | |
| print("ABAC Benchmark Result:") | |
| print(f" Throughput: {mean_throughput:,.0f} req/s") | |
| print(f" Mean Latency: {mean_latency_ms:.4f} ms") | |
| print(f" p99 Latency: {p99_latency_ms:.4f} ms") | |
| print("=" * 60) | |
| assert mean_throughput >= 5000.0, f"ABAC throughput {mean_throughput} below target 5,000 req/s" | |
| return { | |
| "mean_throughput": mean_throughput, | |
| "mean_latency_ms": mean_latency_ms, | |
| "p99_latency_ms": p99_latency_ms, | |
| } | |
| if __name__ == "__main__": | |
| run_abac_benchmark() | |