import subprocess import time import requests # Configuration SERVICE_NAME = "mon_stack_backend" # Change ce nom si différent BACKEND_URL = "http://localhost:5000/request_count" THRESHOLD_UP = 50 # Si plus de 50 requêtes dans l'intervalle -> scale up THRESHOLD_DOWN = 10 # Si moins de 10 requêtes -> scale down MIN_REPLICAS = 1 MAX_REPLICAS = 10 CHECK_INTERVAL = 10 # Secondes entre chaque vérification # Suivi local des requêtes précédentes last_request_count = 0 def get_request_count(): """Récupère le nombre total de requêtes reçues (cumulé) depuis l'API backend""" try: response = requests.get(BACKEND_URL) if response.status_code == 200: return response.json()["data"]["request_received_count"] except Exception as e: print(f"❌ Erreur récupération requêtes : {e}") return 0 def get_current_replicas(): """Récupère le nombre actuel de réplicas du service""" try: result = subprocess.run(["docker", "service", "ls"], capture_output=True, text=True) for line in result.stdout.splitlines(): if SERVICE_NAME in line: return int(line.split()[3].split("/")[0]) # e.g., 3/3 -> 3 except Exception as e: print(f"❌ Erreur récupération réplicas : {e}") return MIN_REPLICAS def scale_service(replicas): """Met à jour le nombre de réplicas via Docker Swarm""" print(f"⚙️ Scaling {SERVICE_NAME} to {replicas} replicas...") subprocess.run(["docker", "service", "scale", f"{SERVICE_NAME}={replicas}"]) print("📈 Autoscaler démarré... (Ctrl+C pour arrêter)\n") while True: current_request_count = get_request_count() current_replicas = get_current_replicas() delta_requests = current_request_count - last_request_count last_request_count = current_request_count print(f"🔄 Requêtes sur les {CHECK_INTERVAL}s : {delta_requests} | Réplicas actuels : {current_replicas}") if delta_requests > THRESHOLD_UP and current_replicas < MAX_REPLICAS: print(f"📈 Augmentation de charge → scaling up !") scale_service(current_replicas + 1) elif delta_requests < THRESHOLD_DOWN and current_replicas > MIN_REPLICAS: print(f"📉 Faible charge → scaling down.") scale_service(current_replicas - 1) else: print("✅ Charge stable. Aucun scaling nécessaire.") print("-" * 50) time.sleep(CHECK_INTERVAL)