97 lines
4.3 KiB
Python
Executable File
97 lines
4.3 KiB
Python
Executable File
#!/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())
|