#!/usr/bin/env python3 """ Script de monitoring pour surveiller la santé de l'API Gemini Affiche les statistiques d'erreurs et les dernières erreurs """ import os import json from datetime import datetime print("="*70) print("MONITORING SANTÉ API GEMINI") print("="*70) # Fichiers de log error_log = "/tmp/smarteye_gemini_errors.log" error_counter = "/tmp/smarteye_gemini_error_count" error_lock = "/tmp/smarteye_gemini_error_last" # 1. Statistiques d'erreurs print("\n📊 STATISTIQUES D'ERREURS") print("-"*70) if os.path.exists(error_counter): try: with open(error_counter, 'r') as f: data = json.loads(f.read()) error_count = data.get("count", 0) first_error = data.get("first_error") last_error = data.get("last_error") print(f"Nombre d'erreurs (dernière heure): {error_count}") if first_error: first_dt = datetime.fromtimestamp(first_error) print(f"Première erreur: {first_dt.strftime('%Y-%m-%d %H:%M:%S')}") if last_error: last_dt = datetime.fromtimestamp(last_error) print(f"Dernière erreur: {last_dt.strftime('%Y-%m-%d %H:%M:%S')}") # Évaluation de la santé if error_count == 0: print("✓ Statut: EXCELLENT - Aucune erreur") elif error_count < 3: print("⚠ Statut: BON - Quelques erreurs mineures") elif error_count < 5: print("⚠ Statut: ATTENTION - Erreurs modérées") else: print("✗ Statut: CRITIQUE - Problème récurrent détecté") except Exception as e: print(f"Erreur lecture compteur: {e}") else: print("✓ Aucune erreur enregistrée") # 2. Cooldown actif print("\n⏱️ COOLDOWN ANTI-SPAM") print("-"*70) if os.path.exists(error_lock): try: with open(error_lock, 'r') as f: last_alert = float(f.read().strip()) last_alert_dt = datetime.fromtimestamp(last_alert) now = datetime.now().timestamp() remaining = max(0, 300 - (now - last_alert)) print(f"Dernière alerte envoyée: {last_alert_dt.strftime('%Y-%m-%d %H:%M:%S')}") if remaining > 0: print(f"⏳ Cooldown actif: {int(remaining)} secondes restantes") else: print("✓ Cooldown terminé - Alertes autorisées") except Exception as e: print(f"Erreur lecture cooldown: {e}") else: print("✓ Pas de cooldown actif") # 3. Dernières erreurs du log print("\n📋 DERNIÈRES ERREURS (10 dernières lignes)") print("-"*70) if os.path.exists(error_log): try: with open(error_log, 'r') as f: lines = f.readlines() last_lines = lines[-30:] if len(lines) > 30 else lines if last_lines: print(''.join(last_lines)) else: print("✓ Aucune erreur dans le log") except Exception as e: print(f"Erreur lecture log: {e}") else: print("✓ Fichier de log non trouvé (aucune erreur)") # 4. Recommandations print("\n💡 RECOMMANDATIONS") print("-"*70) if os.path.exists(error_counter): try: with open(error_counter, 'r') as f: data = json.loads(f.read()) error_count = data.get("count", 0) if error_count >= 5: print("⚠ ACTIONS RECOMMANDÉES:") print(" 1. Vérifier la validité de la clé API Gemini") print(" 2. Vérifier la connectivité réseau") print(" 3. Consulter le log détaillé: /tmp/smarteye_gemini_errors.log") print(" 4. Vérifier les quotas API Google") print(" 5. Tester manuellement l'API avec check_models.py") elif error_count >= 3: print("ℹ️ Surveillance recommandée - Quelques erreurs détectées") else: print("✓ Système fonctionnel - Aucune action requise") except: pass else: print("✓ Système fonctionnel - Aucune action requise") print("\n" + "="*70) print("Fin du rapport") print("="*70)