Update monitoring.py

This commit is contained in:
Egor
2026-01-17 01:16:50 +03:00
committed by GitHub
parent 5cb0ce3030
commit 1b4758cdbf
+37 -44
View File
@@ -8,7 +8,7 @@ from aiogram.fsm.context import FSMContext
from aiogram.exceptions import TelegramBadRequest
from app.config import settings
from app.database.database import get_db
from app.database.database import AsyncSessionLocal
from app.services.monitoring_service import monitoring_service
from app.services.nalogo_queue_service import nalogo_queue_service
from app.services.traffic_monitoring_service import (
@@ -383,12 +383,12 @@ async def _render_notification_settings_for_state(
@admin_required
async def admin_monitoring_menu(callback: CallbackQuery):
try:
async for db in get_db():
async with AsyncSessionLocal() as db:
status = await monitoring_service.get_monitoring_status(db)
running_status = "🟢 Работает" if status['is_running'] else "🔴 Остановлен"
last_update = status['last_update'].strftime('%H:%M:%S') if status['last_update'] else "Никогда"
text = f"""
🔍 <b>Система мониторинга</b>
@@ -404,12 +404,11 @@ async def admin_monitoring_menu(callback: CallbackQuery):
🔧 Выберите действие:
"""
language = callback.from_user.language_code or settings.DEFAULT_LANGUAGE
keyboard = get_monitoring_keyboard(language)
await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard)
break
except Exception as e:
logger.error(f"Ошибка в админ меню мониторинга: {e}")
await callback.answer("❌ Ошибка получения данных", show_alert=True)
@@ -742,7 +741,7 @@ async def force_check_callback(callback: CallbackQuery):
try:
await callback.answer("⏳ Выполняем проверку подписок...")
async for db in get_db():
async with AsyncSessionLocal() as db:
results = await monitoring_service.force_check_subscriptions(db)
text = f"""
@@ -764,7 +763,6 @@ async def force_check_callback(callback: CallbackQuery):
])
await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard)
break
except Exception as e:
logger.error(f"Ошибка принудительной проверки: {e}")
@@ -843,46 +841,45 @@ async def monitoring_logs_callback(callback: CallbackQuery):
if "_page_" in callback.data:
page = int(callback.data.split("_page_")[1])
async for db in get_db():
async with AsyncSessionLocal() as db:
all_logs = await monitoring_service.get_monitoring_logs(db, limit=1000)
if not all_logs:
text = "📋 <b>Логи мониторинга пусты</b>\n\nСистема еще не выполнила проверки."
keyboard = get_monitoring_logs_back_keyboard()
await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard)
return
per_page = 8
paginated_logs = paginate_list(all_logs, page=page, per_page=per_page)
text = f"📋 <b>Логи мониторинга</b> (стр. {page}/{paginated_logs.total_pages})\n\n"
for log in paginated_logs.items:
icon = "" if log['is_success'] else ""
time_str = log['created_at'].strftime('%m-%d %H:%M')
event_type = log['event_type'].replace('_', ' ').title()
message = log['message']
if len(message) > 45:
message = message[:45] + "..."
text += f"{icon} <code>{time_str}</code> {event_type}\n"
text += f" 📄 {message}\n\n"
total_success = sum(1 for log in all_logs if log['is_success'])
total_failed = len(all_logs) - total_success
success_rate = round(total_success / len(all_logs) * 100, 1) if all_logs else 0
text += f"📊 <b>Общая статистика:</b>\n"
text += f"• Всего событий: {len(all_logs)}\n"
text += f"• Успешных: {total_success}\n"
text += f"• Ошибок: {total_failed}\n"
text += f"• Успешность: {success_rate}%"
keyboard = get_monitoring_logs_keyboard(page, paginated_logs.total_pages)
await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard)
break
except Exception as e:
logger.error(f"Ошибка получения логов: {e}")
await callback.answer("❌ Ошибка получения логов", show_alert=True)
@@ -892,17 +889,17 @@ async def monitoring_logs_callback(callback: CallbackQuery):
@admin_required
async def clear_logs_callback(callback: CallbackQuery):
try:
async for db in get_db():
deleted_count = await monitoring_service.cleanup_old_logs(db, days=0)
async with AsyncSessionLocal() as db:
deleted_count = await monitoring_service.cleanup_old_logs(db, days=0)
await db.commit()
if deleted_count > 0:
await callback.answer(f"🗑️ Удалено {deleted_count} записей логов")
else:
await callback.answer("️ Логи уже пусты")
await monitoring_logs_callback(callback)
break
except Exception as e:
logger.error(f"Ошибка очистки логов: {e}")
await callback.answer(f"❌ Ошибка очистки: {str(e)}", show_alert=True)
@@ -942,19 +939,19 @@ async def test_notifications_callback(callback: CallbackQuery):
@admin_required
async def monitoring_statistics_callback(callback: CallbackQuery):
try:
async for db in get_db():
async with AsyncSessionLocal() as db:
from app.database.crud.subscription import get_subscriptions_statistics
sub_stats = await get_subscriptions_statistics(db)
mon_status = await monitoring_service.get_monitoring_status(db)
week_ago = datetime.now() - timedelta(days=7)
week_logs = await monitoring_service.get_monitoring_logs(db, limit=1000)
week_logs = [log for log in week_logs if log['created_at'] >= week_ago]
week_success = sum(1 for log in week_logs if log['is_success'])
week_errors = len(week_logs) - week_success
text = f"""
📊 <b>Статистика мониторинга</b>
@@ -1028,8 +1025,7 @@ async def monitoring_statistics_callback(callback: CallbackQuery):
keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard)
break
except Exception as e:
logger.error(f"Ошибка получения статистики: {e}")
await callback.answer(f"❌ Ошибка получения статистики: {str(e)}", show_alert=True)
@@ -1068,7 +1064,7 @@ async def nalogo_force_process_callback(callback: CallbackQuery):
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
# Перезагружаем статистику
async for db in get_db():
async with AsyncSessionLocal() as db:
from app.database.crud.subscription import get_subscriptions_statistics
sub_stats = await get_subscriptions_statistics(db)
mon_status = await monitoring_service.get_monitoring_status(db)
@@ -1139,7 +1135,6 @@ async def nalogo_force_process_callback(callback: CallbackQuery):
keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
await callback.message.edit_text(stats_text, parse_mode="HTML", reply_markup=keyboard)
break
except Exception as e:
logger.error(f"Ошибка принудительной обработки чеков: {e}")
@@ -1309,7 +1304,7 @@ async def receipts_link_old_callback(callback: CallbackQuery):
TRACKING_START_DATE = datetime(2024, 12, 29, 0, 0, 0)
async for db in get_db():
async with AsyncSessionLocal() as db:
# Получаем старые транзакции без чеков
query = select(Transaction).where(
and_(
@@ -1387,7 +1382,6 @@ async def receipts_link_old_callback(callback: CallbackQuery):
])
await callback.message.edit_text(text, parse_mode="HTML", reply_markup=keyboard)
break
except Exception as e:
logger.error(f"Ошибка привязки старых чеков: {e}", exc_info=True)
@@ -1695,11 +1689,11 @@ def get_monitoring_logs_back_keyboard():
@admin_required
async def monitoring_command(message: Message):
try:
async for db in get_db():
async with AsyncSessionLocal() as db:
status = await monitoring_service.get_monitoring_status(db)
running_status = "🟢 Работает" if status['is_running'] else "🔴 Остановлен"
text = f"""
🔍 <b>Быстрый статус мониторинга</b>
@@ -1709,10 +1703,9 @@ async def monitoring_command(message: Message):
Для подробного управления используйте админ-панель.
"""
await message.answer(text, parse_mode="HTML")
break
except Exception as e:
logger.error(f"Ошибка команды /monitoring: {e}")
await message.answer(f"❌ Ошибка: {str(e)}")