Initial commit: Message Gateway project

- FastAPI приложение для отправки мониторинговых алертов в мессенджеры
- Поддержка Telegram и MAX/VK
- Интеграция с Grafana, Zabbix, AlertManager
- Автоматическое создание тикетов в Jira
- Управление группами мессенджеров через API
- Декораторы для авторизации и скрытия эндпоинтов
- Подробная документация в папке docs/

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-11-12 20:25:11 +03:00
commit b90def35ed
72 changed files with 10609 additions and 0 deletions

97
app/core/utils.py Normal file
View File

@@ -0,0 +1,97 @@
"""
Вспомогательные утилиты.
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import re
import logging
from typing import List
logger = logging.getLogger(__name__)
# Список стоп-слов (алерты, которые не должны отправляться)
STOP_WORDS = [
r"^InfoInhibitor",
r"^Watchdog",
r"^[E,e]tcdHighCommitDurations",
r"^[E,e]tcdHighNumberOfFailedGRPCRequests",
r"^[K,k]ubePersistentVolumeFillingUp",
r"^[K,k]ubePersistentVolumeInodesFillingUp",
]
def check_stop_words(name: str) -> bool:
"""
Проверить, содержит ли название алерта стоп-слова.
Args:
name: Название алерта.
Returns:
True если алерт должен быть заблокирован, False в противном случае.
"""
logger.debug(f"Проверка стоп-слов для алерта: '{name}'")
for pattern in STOP_WORDS:
if re.search(pattern, name):
logger.warning(f"Алерт '{name}' заблокирован стоп-словом: {pattern}")
return True
return False
def add_spaces_to_alert_name(name: str) -> str:
"""
Добавить пробелы в название алерта для лучшей читаемости.
Пример: "HighCPUUsage" -> "High CPU Usage"
Args:
name: Название алерта без пробелов.
Returns:
Название алерта с пробелами.
"""
if not name:
return name
result = name[0]
for letter in name[1:]:
if letter.isupper():
result += f' {letter}'
else:
result += letter
# Исправляем известные сокращения
result = result.replace('C P U', 'CPU')
result = result.replace('etcd', 'ETCD')
result = result.replace('A P I', 'API')
result = result.replace('K 8 S', 'K8S')
result = result.replace('P V C', 'PVC')
result = result.replace('G R P C', 'GRPC')
return result
def truncate_message(message: str, max_length: int = 4090) -> str:
"""
Обрезать сообщение до максимальной длины для Telegram.
Telegram имеет лимит в 4096 символов на сообщение.
Args:
message: Исходное сообщение.
max_length: Максимальная длина сообщения.
Returns:
Обрезанное сообщение с индикацией обрезки.
"""
if len(message) <= max_length:
return message
truncated = message[:max_length - 10]
truncated += "\n\n... (сообщение обрезано)"
logger.warning(f"Сообщение обрезано с {len(message)} до {max_length} символов")
return truncated