Compare commits

..

2 Commits

Author SHA1 Message Date
161ad3eaa3 chore: (dependency) Update requirements.txt with all new dependencies include tzdate module
Some checks failed
Build and Push Docker Images / build (push) Failing after 1m37s
Signed-off-by: UdoChudo <stream@udochudo.ru>
2025-06-27 20:37:50 +05:00
ab33329e31 feat: (tg message composer) improve composing message now have more usefull information
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>
2025-06-27 20:37:06 +05:00
3 changed files with 78 additions and 19 deletions

View File

@ -1,8 +1,12 @@
# composer.py # composer.py
import time from datetime import datetime
from typing import Optional, Tuple from typing import Optional, Tuple
from app.bot.utils.tg_escape_chars import escape_telegram_chars # или твоя функция, если кастомная 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]]: def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
""" """
@ -19,6 +23,12 @@ def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
'High': '⚠️', 'High': '⚠️',
'Disaster': '⛔️' 'Disaster': '⛔️'
} }
convert_time_format = {
"h": "ч",
"m": "м",
"s": "с"
}
priority = priority_map.get(data.get('severity', ''), '') priority = priority_map.get(data.get('severity', ''), '')
msg = escape_telegram_chars(data.get('msg', '')) msg = escape_telegram_chars(data.get('msg', ''))
host = escape_telegram_chars(data.get('host', '')) host = escape_telegram_chars(data.get('host', ''))
@ -26,7 +36,8 @@ def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
severity = escape_telegram_chars(data.get('severity', '')) severity = escape_telegram_chars(data.get('severity', ''))
status = data.get('status', '').upper() status = data.get('status', '').upper()
timestamp = int(data.get('date_reception', 0)) timestamp = int(data.get('date_reception', 0))
time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)) dt = datetime.fromtimestamp(timestamp, tz=ZoneInfo(ZABBIX_TZ))
time_str = dt.strftime('%d.%m.%Y %H:%M:%S')
if status == "PROBLEM": if status == "PROBLEM":
message = ( message = (
@ -36,16 +47,36 @@ def compose_telegram_message(data: dict) -> Tuple[str, Optional[str]]:
f"<b>Время возникновения</b>: {time_str} Мск\n" f"<b>Время возникновения</b>: {time_str} Мск\n"
) )
else: 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 = ( message = (
f"{host} ({ip})\n" f"{host} ({ip})\n"
f"<b>Описание</b>: {msg}\n" f"<b>Описание</b>: {msg}\n"
f"<b>Критичность</b>: {severity}\n" f"<b>Критичность</b>: {severity}\n"
f"<b>Проблема устранена!</b>\n" f"<b>Проблема устранена!</b>\n"
f"<b>Время начала</b>: {time_start} Мск\n"
f"<b>Время устранения</b>: {time_str} Мск\n" f"<b>Время устранения</b>: {time_str} Мск\n"
f"<b>Длительность проблемы</b>: {duration}\n"
) )
link = data.get("link") link = data.get("link")
return message, link return message, link
except KeyError as e: except KeyError as e:
raise ValueError(f"Missing key in data: {e}") raise ValueError(f"Missing key in data: {e}")

View File

@ -12,6 +12,6 @@ def create_link_button(link: Optional[str]) -> Optional[InlineKeyboardMarkup]:
return None return None
markup = InlineKeyboardMarkup() markup = InlineKeyboardMarkup()
button = InlineKeyboardButton(text="График", url=link) button = InlineKeyboardButton(text="Открыть график", url=link)
markup.add(button) markup.add(button)
return markup return markup

View File

@ -1,14 +1,42 @@
telebot~=0.0.5 aio-pika==9.5.5
pyTelegramBotAPI~=4.27.0 aiormq==6.8.1
pyzabbix~=1.3.1 blinker==1.9.0
SQLAlchemy~=2.0.40 certifi==2025.4.26
Flask~=3.1.0 charset-normalizer==3.4.2
Flask-Login~=0.6.3 click==8.1.8
Flask-SQLAlchemy~=3.1.1 colorama==0.4.6
Flask-ldap3-login~=1.0.2 concurrent-log-handler==0.9.26
Werkzeug~=3.1.3 exceptiongroup==1.2.2
aio-pika~=9.5.5 Flask==3.1.0
pika~=1.3.2 flask-ldap3-login==1.0.2
pytz~=2025.2 Flask-Login==0.6.3
requests~=2.32.3 Flask-SQLAlchemy==3.1.1
gunicorn~=23.0.0 Flask-WTF==1.2.2
greenlet==3.2.1
gunicorn==23.0.0
idna==3.10
itsdangerous==2.2.0
Jinja2==3.1.6
ldap3==2.9.1
MarkupSafe==3.0.2
multidict==6.4.3
packaging==25.0
pamqp==3.3.0
pika==1.3.2
pika-stubs==0.1.3
portalocker==3.1.1
propcache==0.3.1
pyasn1==0.6.1
pyTelegramBotAPI==4.27.0
pytz==2025.2
pywin32==310
pyzabbix==1.3.1
requests==2.32.3
SQLAlchemy==2.0.40
telebot==0.0.5
typing_extensions==4.13.2
tzdata==2025.2
urllib3==2.4.0
Werkzeug==3.1.3
WTForms==3.2.1
yarl==1.20.0