Remove .env_example file and implement MetricsUpdater service for enhanced metrics tracking. Update bot.py to start and stop metrics updater, and improve database connection handling in CRUD operations with metrics tracking. Update README with details on metrics issues and fixes.
This commit is contained in:
96
scripts/diagnose_db_connections.py
Executable file
96
scripts/diagnose_db_connections.py
Executable file
@@ -0,0 +1,96 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user