From 5ec52712327935d13676d82b4bb3518150270383 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Mon, 27 Apr 2026 17:15:44 +0200 Subject: [PATCH] perf(qualys/dashboard): parallelise fetch vulns par batch IPs (8 workers, ~18min -> ~3min) --- app/services/qualys_service.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/services/qualys_service.py b/app/services/qualys_service.py index 5bb626e..af7b5ac 100644 --- a/app/services/qualys_service.py +++ b/app/services/qualys_service.py @@ -959,18 +959,25 @@ def compute_vuln_dashboard(db, triggered_by="manual", run_id=None): """)).fetchall() asset_count = len(rows) - # 5. Recuperer vulns par batch de 50 IPs (cache 10min via get_vuln_counts) + # 5. Recuperer vulns par batch de 50 IPs en parallele (cache 10min via get_vuln_counts) + # Une session par thread pour eviter les conflits SQLAlchemy + from app.database import SessionLocal ip_to_vuln = {} unique_ips = list({str(r.ip_address) for r in rows if r.ip_address and str(r.ip_address) != "None"}) - for i in range(0, len(unique_ips), 50): - batch = unique_ips[i:i+50] + batches = [unique_ips[i:i+50] for i in range(0, len(unique_ips), 50)] + def _fetch_vuln_batch(batch): + s = SessionLocal() try: - vmap = get_vuln_counts(db, ",".join(batch)) + return get_vuln_counts(s, ",".join(batch)) + except Exception: + return {} + finally: + s.close() + with ThreadPoolExecutor(max_workers=8) as ex: + for vmap in ex.map(_fetch_vuln_batch, batches): if vmap: ip_to_vuln.update(vmap) - except Exception: - pass # 6. Classifier + agreger en utilisant les associations API agg = {}