- FastAPI приложение для отправки мониторинговых алертов в мессенджеры - Поддержка Telegram и MAX/VK - Интеграция с Grafana, Zabbix, AlertManager - Автоматическое создание тикетов в Jira - Управление группами мессенджеров через API - Декораторы для авторизации и скрытия эндпоинтов - Подробная документация в папке docs/ Автор: Сергей Антропов Сайт: https://devops.org.ru
98 lines
2.9 KiB
Python
98 lines
2.9 KiB
Python
"""
|
||
Вспомогательные утилиты.
|
||
|
||
Автор: Сергей Антропов
|
||
Сайт: 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
|