Initial commit: Message Gateway project
- FastAPI приложение для отправки мониторинговых алертов в мессенджеры - Поддержка Telegram и MAX/VK - Интеграция с Grafana, Zabbix, AlertManager - Автоматическое создание тикетов в Jira - Управление группами мессенджеров через API - Декораторы для авторизации и скрытия эндпоинтов - Подробная документация в папке docs/ Автор: Сергей Антропов Сайт: https://devops.org.ru
This commit is contained in:
97
app/core/utils.py
Normal file
97
app/core/utils.py
Normal 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
|
||||
Reference in New Issue
Block a user