77 lines
3.4 KiB
Python
77 lines
3.4 KiB
Python
# <MODULE name="monitoring_service" semantics="main_entrypoint_for_cron" />
|
||
|
||
# <IMPORTS>
|
||
import logging
|
||
import asyncio
|
||
import sys
|
||
import os
|
||
from datetime import datetime
|
||
|
||
# Добавляем 'src' в sys.path, чтобы внутренние импорты (e.g., `from core...`) работали
|
||
sys.path.insert(0, os.path.join(os.path.abspath(os.path.dirname(__file__)), 'src'))
|
||
|
||
from orchestrator import AppOrchestrator
|
||
from core.settings import settings
|
||
from core.logging_config import setup_logging
|
||
from analyzer import DataAnalyzer
|
||
from 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" />
|