add monitoring service & Telegram sender
This commit is contained in:
70
monitoring_service.py
Normal file
70
monitoring_service.py
Normal 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" />
|
||||
Reference in New Issue
Block a user