Files
MessageGateway/app/core/utils.py
Sergey Antropov b90def35ed Initial commit: Message Gateway project
- FastAPI приложение для отправки мониторинговых алертов в мессенджеры
- Поддержка Telegram и MAX/VK
- Интеграция с Grafana, Zabbix, AlertManager
- Автоматическое создание тикетов в Jira
- Управление группами мессенджеров через API
- Декораторы для авторизации и скрытия эндпоинтов
- Подробная документация в папке docs/

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-11-12 20:25:11 +03:00

98 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Вспомогательные утилиты.
Автор: Сергей Антропов
Сайт: 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