yusufcalisir's picture
deploy: Hugging Face space upload
0b2fafb
Raw History Blame Contribute Delete
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()