Add event duration time Add event start date and time Add event resolved date and time Add event chart link Signed-off-by: UdoChudo <stream@udochudo.ru>
82 lines
3.2 KiB
Python
82 lines
3.2 KiB
Python
# composer.py
|
||
|
||
from datetime import datetime
|
||
from typing import Optional, Tuple
|
||
from zoneinfo import ZoneInfo
|
||
|
||
from app.bot.utils.tg_escape_chars import escape_telegram_chars # или твоя функция, если кастомная
|
||
from config import ZABBIX_TZ
|
||
|
||
|
||
def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
|
||
"""
|
||
Формирует сообщение для Telegram и возвращает его вместе со ссылкой (если есть).
|
||
|
||
Args:
|
||
data (dict): сообщение из очереди
|
||
|
||
Returns:
|
||
Tuple[str, Optional[str]]: текст сообщения и ссылка для кнопки (если есть)
|
||
"""
|
||
try:
|
||
priority_map = {
|
||
'High': '⚠️',
|
||
'Disaster': '⛔️'
|
||
}
|
||
convert_time_format = {
|
||
"h": "ч",
|
||
"m": "м",
|
||
"s": "с"
|
||
}
|
||
|
||
priority = priority_map.get(data.get('severity', ''), '')
|
||
msg = escape_telegram_chars(data.get('msg', ''))
|
||
host = escape_telegram_chars(data.get('host', ''))
|
||
ip = escape_telegram_chars(data.get('ip', ''))
|
||
severity = escape_telegram_chars(data.get('severity', ''))
|
||
status = data.get('status', '').upper()
|
||
timestamp = int(data.get('date_reception', 0))
|
||
dt = datetime.fromtimestamp(timestamp, tz=ZoneInfo(ZABBIX_TZ))
|
||
time_str = dt.strftime('%d.%m.%Y %H:%M:%S')
|
||
|
||
if status == "PROBLEM":
|
||
message = (
|
||
f"{priority} {host} ({ip})\n"
|
||
f"<b>Описание</b>: {msg}\n"
|
||
f"<b>Критичность</b>: {severity}\n"
|
||
f"<b>Время возникновения</b>: {time_str} Мск\n"
|
||
)
|
||
else:
|
||
event_duration = data.get('event_duration', '')
|
||
duration = ' '.join(
|
||
f"{part[:-1]}{convert_time_format.get(part[-1], part[-1])}"
|
||
for part in event_duration.split()
|
||
)
|
||
|
||
# Переформатируем event_date из '2025.06.27 16:46:04' в '27.06.2025 16:46:04'
|
||
event_date_str = data.get('event_date', '')
|
||
if event_date_str:
|
||
try:
|
||
dt_start = datetime.strptime(event_date_str, "%Y.%m.%d %H:%M:%S")
|
||
# не меняем timezone, просто меняем формат
|
||
time_start = dt_start.strftime('%d.%m.%Y %H:%M:%S')
|
||
except Exception:
|
||
time_start = event_date_str # fallback — оставляем как есть
|
||
else:
|
||
time_start = ''
|
||
|
||
message = (
|
||
f"✅ {host} ({ip})\n"
|
||
f"<b>Описание</b>: {msg}\n"
|
||
f"<b>Критичность</b>: {severity}\n"
|
||
f"<b>Проблема устранена!</b>\n"
|
||
f"<b>Время начала</b>: {time_start} Мск\n"
|
||
f"<b>Время устранения</b>: {time_str} Мск\n"
|
||
f"<b>Длительность проблемы</b>: {duration}\n"
|
||
)
|
||
|
||
link = data.get("link")
|
||
return message, link
|
||
|
||
except KeyError as e:
|
||
raise ValueError(f"Missing key in data: {e}") |