perf(qualys/dashboard): parallelise fetch vulns par batch IPs (8 workers, ~18min -> ~3min)

This commit is contained in:
Pierre & Lumière 2026-04-27 17:15:44 +02:00
parent ad630eba99
commit 5ec5271232

View File

@ -959,18 +959,25 @@ def compute_vuln_dashboard(db, triggered_by="manual", run_id=None):
""")).fetchall() """)).fetchall()
asset_count = len(rows) 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 = {} ip_to_vuln = {}
unique_ips = list({str(r.ip_address) for r in rows unique_ips = list({str(r.ip_address) for r in rows
if r.ip_address and str(r.ip_address) != "None"}) if r.ip_address and str(r.ip_address) != "None"})
for i in range(0, len(unique_ips), 50): batches = [unique_ips[i:i+50] for i in range(0, len(unique_ips), 50)]
batch = unique_ips[i:i+50] def _fetch_vuln_batch(batch):
s = SessionLocal()
try: 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: if vmap:
ip_to_vuln.update(vmap) ip_to_vuln.update(vmap)
except Exception:
pass
# 6. Classifier + agreger en utilisant les associations API # 6. Classifier + agreger en utilisant les associations API
agg = {} agg = {}