#!/usr/bin/env python3 """ Скрипт для диагностики проблем с соединениями БД """ import asyncio import sys import os from pathlib import Path # Добавляем путь к проекту project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) from database.crud import get_connection_pool from services.infrastructure.metrics import get_metrics_service async def diagnose_connections(): """Диагностика соединений БД""" print("🔍 Диагностика соединений БД AnonBot") print("=" * 50) # Путь к БД db_path = project_root / "database" / "anon_qna.db" if not db_path.exists(): print(f"❌ База данных не найдена: {db_path}") return print(f"📁 База данных: {db_path}") # Получаем пул соединений pool = get_connection_pool(str(db_path)) stats = pool.get_pool_stats() print("\n📊 Статистика пула соединений:") print(f" • Размер пула: {stats['pool_size']}") print(f" • Созданных соединений: {stats['created_connections']}") print(f" • Доступных соединений: {stats['available_connections']}") print(f" • Утилизация: {stats['utilization_percent']:.1f}%") # Анализ проблем print("\n🔍 Анализ:") if stats['created_connections'] > stats['pool_size']: print(f" ❌ КРИТИЧЕСКАЯ ПРОБЛЕМА: Создано {stats['created_connections']} соединений при лимите {stats['pool_size']}") print(f" Это указывает на утечку соединений!") elif stats['utilization_percent'] > 80: print(f" ⚠️ ВНИМАНИЕ: Высокая утилизация пула ({stats['utilization_percent']:.1f}%)") else: print(f" ✅ Пул соединений работает нормально") # Проверяем метрики print("\n📈 Метрики Prometheus:") try: metrics_service = get_metrics_service() metrics_data = metrics_service.get_metrics() # Ищем метрики соединений lines = metrics_data.decode('utf-8').split('\n') connection_metrics = [line for line in lines if 'anon_bot_db_connections' in line or 'anon_bot_db_pool' in line] if connection_metrics: for metric in connection_metrics: if metric.strip(): print(f" • {metric}") else: print(" • Метрики соединений не найдены") except Exception as e: print(f" ❌ Ошибка получения метрик: {e}") # Рекомендации print("\n💡 Рекомендации:") if stats['created_connections'] > stats['pool_size']: print(" 1. Перезапустите AnonBot для сброса пула соединений") print(" 2. Проверьте логи на наличие ошибок БД") print(" 3. Убедитесь, что все соединения правильно закрываются") print(" 4. Мониторьте метрики в Grafana") elif stats['utilization_percent'] > 80: print(" 1. Рассмотрите увеличение размера пула соединений") print(" 2. Проверьте производительность запросов к БД") print(" 3. Оптимизируйте часто используемые запросы") else: print(" 1. Продолжайте мониторинг метрик") print(" 2. Настройте алерты в Grafana") print("\n🔧 Команды для мониторинга:") print(" • Просмотр метрик: curl http://localhost:8081/metrics | grep anon_bot_db") print(" • Проверка здоровья: curl http://localhost:8081/health") print(" • Статус процесса: curl http://localhost:8081/status") if __name__ == "__main__": asyncio.run(diagnose_connections())