add monitoring service & Telegram sender

This commit is contained in:
2025-07-20 08:34:28 +03:00
parent 0259289ee9
commit ae9c61facc
5 changed files with 276 additions and 5 deletions

70
monitoring_service.py Normal file
View File

@@ -0,0 +1,70 @@
# <MODULE name="monitoring_service" semantics="main_entrypoint_for_cron" />
# <IMPORTS>
import logging
import asyncio
from datetime import datetime
from src.orchestrator import AppOrchestrator
from src.core.settings import settings
from src.core.logging_config import setup_logging
from src.analyzer import DataAnalyzer
from src.utils.telegram_sender import send_telegram_notification
# </IMPORTS>
# <CONTRACT for="main">
# description: "Главная точка входа для сервиса мониторинга. Запускается по расписанию (cron)."
# postconditions:
# - "Парсер запускается, данные сохраняются в БД."
# - "Если обнаружены изменения, отправляется отчет в Telegram."
# </CONTRACT>
# <ENTRYPOINT name="main">
async def main():
"""
Основная асинхронная функция, которая запускает парсер,
анализирует данные и отправляет уведомление.
"""
run_id = datetime.now().strftime("%Y%m%d-%H%M%S")
setup_logging(run_id=run_id)
logger = logging.getLogger(__name__)
logger.info(f"🚀 Запуск сервиса мониторинга. Run ID: {run_id}")
try:
# 1. Запуск парсера
logger.info("Начало этапа парсинга...")
orchestrator = AppOrchestrator(settings=settings)
orchestrator.run()
logger.info("Этап парсинга завершен.")
# 2. Анализ данных
logger.info("Начало этапа анализа данных...")
analyzer = DataAnalyzer()
report_message = analyzer.analyze()
logger.info("Этап анализа данных завершен.")
# 3. Отправка отчета
if report_message:
logger.info("Обнаружены изменения, отправка отчета в Telegram...")
await send_telegram_notification(report_message)
else:
logger.info("Изменений не найдено, отправка отчета не требуется.")
except Exception as e:
logger.critical(f"💥 Критическая ошибка в сервисе мониторинга: {e}", exc_info=True)
# Попытка отправить уведомление об ошибке
try:
error_message = f"<b>❗️ Критическая ошибка в сервисе мониторинга</b>\n\n<pre>{e}</pre>"
await send_telegram_notification(error_message)
except Exception as tg_e:
logger.error(f"Не удалось даже отправить уведомление об ошибке в Telegram: {tg_e}")
logger.info("✅ Сервис мониторинга завершил работу.")
# <MAIN_CONTRACT>
# description: "Стандартный блок для запуска main() при выполнении скрипта."
# </MAIN_CONTRACT>
if __name__ == "__main__":
# Используем asyncio.run() для запуска асинхронной функции main
asyncio.run(main())
# <COHERENCE_CHECK status="PASSED" />