Files
AnonBot/scripts/diagnose_db_connections.py

97 lines
4.3 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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())