Files
MessageGateway/README.md
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

643 lines
29 KiB
Markdown
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.

# Message Gateway
Приложение для отправки мониторинговых алертов из Grafana, Zabbix и AlertManager в мессенджеры (Telegram, MAX/VK) и создания тикетов в Jira.
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Message Gateway - это микросервис, который принимает webhooks от систем мониторинга (Grafana, Zabbix, AlertManager) и отправляет уведомления в различные мессенджеры (Telegram, MAX/VK). Также поддерживает автоматическое создание тикетов в Jira на основе алертов. Поддерживает фильтрацию по стоп-словам, форматирование сообщений через Jinja2 шаблоны и интеграцию с Prometheus для сбора метрик.
### Поддержка мессенджеров
- **Telegram** - Полная поддержка текстовых сообщений, медиа (фото, видео, аудио, документы) и тредов
- **MAX/VK** - Поддержка текстовых сообщений и медиа (треды не поддерживаются)
## Документация
Подробная документация разделена на отдельные файлы в папке [`docs/`](docs/):
### Основная документация
- 📖 [Настройка ботов](docs/bots.md) - как создать ботов в Telegram и MAX/VK
- 📖 [Конфигурация групп](docs/groups.md) - как настроить группы мессенджеров
- 📖 [Шаблоны сообщений](docs/templates.md) - как работают шаблоны Jinja2
- 📖 [Конфигурация Jira Mapping](docs/jira-mapping.md) - как настроить маппинг алертов в Jira
- 📖 [Отправка сообщений](docs/messaging.md) - как работает отправка сообщений
### Настройка систем мониторинга
- 📖 [Настройка Grafana](docs/monitoring/grafana.md) - как настроить Grafana для отправки алертов
- 📖 [Настройка Zabbix](docs/monitoring/zabbix.md) - как настроить Zabbix для отправки алертов
- 📖 [Настройка AlertManager](docs/monitoring/alertmanager.md) - как настроить AlertManager для отправки алертов
### API документация
- 📖 [API для управления группами](docs/api/groups.md) - управление группами мессенджеров через API
- 📖 [API для отправки сообщений](docs/api/message.md) - отправка простых сообщений в мессенджеры
- 📖 [API для проверки здоровья](docs/api/health.md) - проверка здоровья и готовности приложения
- 📖 [API для отладки](docs/api/debug.md) - сохранение JSON данных для отладки
- 📖 [Декораторы API](docs/api/decorators.md) - декораторы для авторизации и скрытия эндпоинтов
## Возможности
- ✅ Отправка алертов из Grafana в мессенджеры (Telegram, MAX/VK)
- ✅ Отправка алертов из Zabbix в мессенджеры (Telegram, MAX/VK)
- ✅ Отправка алертов из AlertManager в мессенджеры (Telegram, MAX/VK)
- ✅ Поддержка отправки в треды Telegram (не поддерживается для MAX/VK)
-**Поддержка нескольких мессенджеров (Telegram, MAX/VK)**
-**Отправка простых текстовых сообщений**
-**Отправка фото, видео, аудио и документов**
-**Управление группами мессенджеров (CRUD)**
-**Защита управления группами API ключом**
-**Автоматическое создание тикетов в Jira**
-**Настройка маппинга алертов в Jira тикеты**
- ✅ Фильтрация по стоп-словам
- ✅ Форматирование сообщений через Jinja2 шаблоны
- ✅ Метрики Prometheus
- ✅ Интеграция с OpenTelemetry
- ✅ Кэширование конфигурации групп
- ✅ Асинхронная обработка запросов
- ✅ Валидация данных через Pydantic
- ✅ Подробное логирование
## Требования
- Python 3.11+
- Docker и Docker Compose
- Telegram Bot Token (для Telegram)
- MAX/VK Access Token (для MAX/VK, опционально)
- Конфигурация групп мессенджеров (config/groups.json)
- Пароль для управления группами (опционально, для CRUD операций)
- Jira API Token (опционально, для интеграции с Jira)
## Установка
### 1. Клонирование репозитория
```bash
git clone <repository-url>
cd message-gateway
```
### 2. Настройка переменных окружения
Создайте файл `.env` на основе `.env.example`:
```bash
cp env.example .env
```
Отредактируйте `.env` и укажите необходимые переменные:
```env
# Telegram настройки
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
TELEGRAM_ENABLED=true
# MAX/VK настройки (опционально)
MAX_ACCESS_TOKEN=your_max_access_token_here
MAX_API_VERSION=5.131
MAX_ENABLED=false
# Общие настройки мессенджеров
DEFAULT_MESSENGER=telegram
# Настройки мониторинга
GRAFANA_URL=http://grafana.example.com
ZABBIX_URL=https://zabbix.example.com
# Jira настройки (опционально)
JIRA_ENABLED=false
JIRA_URL=https://jira.example.com
JIRA_EMAIL=user@example.com
JIRA_API_TOKEN=your_jira_api_token_here
JIRA_PROJECT_KEY=MON
JIRA_DEFAULT_ASSIGNEE=user@example.com
JIRA_DEFAULT_ISSUE_TYPE=Bug
JIRA_CREATE_ON_ALERT=true
JIRA_CREATE_ON_RESOLVED=false
```
### 3. Настройка конфигурации групп
Отредактируйте `config/groups.json` и добавьте группы мессенджеров.
> 📖 **Подробная документация:** [Конфигурация групп](docs/groups.md)
```json
{
"monitoring": {
"messenger": "telegram",
"chat_id": -1001234567890,
"thread_id": 0,
"config": {}
},
"alerts": {
"messenger": "telegram",
"chat_id": -1001234567891,
"thread_id": 0,
"config": {}
},
"max_alerts": {
"messenger": "max",
"chat_id": "123456789",
"thread_id": null,
"config": {
"access_token": "optional_override_max_token"
}
}
}
```
**Примечания:**
- `messenger` - тип мессенджера (`telegram`, `max`) - обязательное поле
- `chat_id` - ID чата (может быть числом для Telegram или строкой для MAX/VK) - обязательное поле
- `thread_id` - ID треда в группе (только для Telegram, `0` для основной группы, `null` для MAX/VK)
- `config` - дополнительная конфигурация для мессенджера (например, `access_token` для MAX/VK)
### 4. Настройка конфигурации маппинга Jira
Отредактируйте `config/jira_mapping.json` и настройте маппинг алертов в Jira тикеты.
> 📖 **Подробная документация:** [Конфигурация Jira Mapping](docs/jira-mapping.md)
```json
{
"alertmanager": {
"default_project": "MON",
"default_assignee": null,
"default_issue_type": "Bug",
"default_priority": "High",
"mappings": [
{
"conditions": {
"severity": "critical",
"namespace": "production"
},
"project": "MON",
"assignee": null,
"issue_type": "Bug",
"priority": "Highest",
"labels": ["critical", "production", "alertmanager"]
}
]
}
}
```
### 5. Запуск приложения
#### Использование Docker Compose
```bash
# Первый запуск (сборка и запуск)
make up-build
# Последующие запуски
make up
# Или напрямую через docker-compose
docker-compose up -d
```
#### Использование Makefile
```bash
make help # Показать справку по всем командам
make build # Собрать Docker образ
make up # Запустить приложение
make up-build # Собрать и запустить приложение (рекомендуется для первого запуска)
make logs # Показать логи
make shell # Открыть shell в контейнере
make down # Остановить приложение
make status # Показать статус контейнеров
make health # Проверить здоровье приложения
make ready # Проверить готовность приложения
```
> **Примечание:** Все команды выполняются через Makefile. Скрипты `.sh` больше не используются и были удалены.
>
> **Подкоманды:** Для удобства использования подкоманд (docker, git, k8s, env) доступны три варианта:
> 1. Через переменную CMD: `make docker CMD=build`
> 2. Напрямую: `make docker-build`
> 3. Через обертку: `./make-wrapper.sh docker build` (для синтаксиса с пробелами)
Доступные команды:
**Основные команды:**
- `make build` - Собрать Docker образ
- `make up` - Запустить приложение
- `make up-build` - Собрать и запустить приложение (рекомендуется для первого запуска)
- `make down` - Остановить приложение
- `make restart` - Перезапустить приложение
- `make logs` - Показать логи приложения
- `make shell` - Открыть shell в контейнере
- `make stop` - Остановить приложение (alias для down)
- `make status` - Показать статус контейнеров
- `make health` - Проверить здоровье приложения
- `make ready` - Проверить готовность приложения
**Разработка:**
- `make dev` - Запустить в режиме разработки
- `make test` - Запустить тесты
- `make lint` - Запустить линтер
- `make format` - Форматировать код
- `make install` - Установить зависимости
- `make clean` - Очистить Docker образы и контейнеры
- `make clean-all` - Очистить все Docker ресурсы (включая volumes)
**Docker команды:**
- `make docker CMD=build` или `make docker-build` - Собрать Docker образ (без docker-compose)
- `make docker CMD=tag` или `make docker-tag` - Тегировать Docker образ для registry
- `make docker CMD=push` или `make docker-push` - Собрать, тегировать и отправить образ в registry
- `make docker CMD=run` или `make docker-run` - Запустить контейнер (без docker-compose)
- `make docker CMD=stop` или `make docker-stop` - Остановить контейнер (без docker-compose)
- `make docker CMD=logs` или `make docker-logs` - Показать логи контейнера (без docker-compose)
- `make docker CMD=shell` или `make docker-shell` - Открыть shell в контейнере (без docker-compose)
- `./make-wrapper.sh docker build` - Альтернативный синтаксис через обертку
**Git команды:**
- `make git CMD=status` или `make git-status` - Показать статус репозитория
- `make git CMD=pull` или `make git-pull` - Получить изменения из удаленного репозитория
- `make git CMD=push ARGS=origin main` или `make git-push` - Отправить изменения в удаленный репозиторий
- `make git CMD=add ARGS=file1 file2` или `make git-add ARGS=file1 file2` - Добавить файлы в индекс
- `make git CMD=commit ARGS="message"` или `make git-commit ARGS="message"` - Создать коммит
- `make git CMD=branch` или `make git-branch` - Показать список веток
- `./make-wrapper.sh git status` - Альтернативный синтаксис через обертку
- `./make-wrapper.sh git push origin main` - Отправить изменения с аргументами
**Kubernetes команды:**
- `make k8s CMD=contexts` или `make k8s-contexts` - Показать доступные контексты
- `make k8s CMD=set-context CONTEXT=prod` или `make k8s-set-context CONTEXT=prod` - Установить контекст
- `make k8s CMD=apply` или `make k8s-apply` - Применить манифесты
- `make k8s CMD=apply CONTEXT=prod` - Применить манифесты с указанием контекста
- `make k8s CMD=delete` или `make k8s-delete` - Удалить ресурсы
- `make k8s CMD=status` или `make k8s-status` - Показать статус подов
- `make k8s CMD=logs` или `make k8s-logs` - Показать логи подов
- `make k8s CMD=shell` или `make k8s-shell` - Открыть shell в поде
- `./make-wrapper.sh k8s apply CONTEXT=prod` - Альтернативный синтаксис через обертку
**Env команды:**
- `make env CMD=check` или `make env-check` - Проверить наличие .env файла
- `make env CMD=create` или `make env-create` - Создать .env файл из env.example
- `make env CMD=create-force` или `make env-create-force` - Принудительно создать .env файл (перезаписать существующий)
- `./make-wrapper.sh env check` - Альтернативный синтаксис через обертку
**Утилиты:**
- `make version` - Показать версию проекта
- `make psql` - Подключиться к PostgreSQL (если используется)
- `make redis-cli` - Подключиться к Redis (если используется)
## Использование
### API Endpoints
> 📖 **Подробная документация API:**
> - [API для управления группами](docs/api/groups.md)
> - [API для отправки сообщений](docs/api/message.md)
> - [API для проверки здоровья](docs/api/health.md)
> - [API для отладки](docs/api/debug.md)
#### Мониторинг (без авторизации)
Все эндпоинты мониторинга объединены под тегом `monitoring` и **не требуют авторизации**:
- `POST /api/v1/grafana/{group_name}/{thread_id}` - Отправка алерта из Grafana
- `POST /api/v1/zabbix/{group_name}/{thread_id}` - Отправка алерта из Zabbix
- `POST /api/v1/alertmanager/{k8s_cluster}/{group_name}/{thread_id}` - Отправка алерта из AlertManager
> 📖 **Подробная документация:**
> - [Настройка Grafana](docs/monitoring/grafana.md)
> - [Настройка Zabbix](docs/monitoring/zabbix.md)
> - [Настройка AlertManager](docs/monitoring/alertmanager.md)
**Примечание:** Эндпоинты мониторинга объединены в один файл `app/api/v1/endpoints/monitoring.py` и используют общий тег `monitoring` в Swagger UI.
#### Управление группами (требуется API ключ)
- `GET /api/v1/groups/messengers` - Получить список поддерживаемых мессенджеров
- `GET /api/v1/groups` - Получить список групп (без API ключа - только названия, с API ключом - полная информация)
- `POST /api/v1/groups` - Создать группу
- `PUT /api/v1/groups/{group_name}` - Обновить группу
- `DELETE /api/v1/groups/{group_name}` - Удалить группу
> 📖 **Подробная документация:** [API для управления группами](docs/api/groups.md)
#### Отправка сообщений (требуется API ключ)
Все эндпоинты для отправки сообщений защищены декоратором `@require_api_key` и **требуют API ключ** в заголовке `X-API-Key`:
- `POST /api/v1/message/text` - Отправить текстовое сообщение
- `POST /api/v1/message/photo` - Отправить фото
- `POST /api/v1/message/video` - Отправить видео
- `POST /api/v1/message/audio` - Отправить аудио
- `POST /api/v1/message/document` - Отправить документ
**Аутентификация:**
- Все эндпоинты требуют заголовок `X-API-Key: your_api_key_here`
- API ключ настраивается в переменной окружения `API_KEY` в файле `.env`
- В Swagger UI доступна авторизация через кнопку "Authorize" (🔒)
> 📖 **Подробная документация:** [API для отправки сообщений](docs/api/message.md)
#### Проверка здоровья (без авторизации)
- `GET /api/v1/health` - Проверка здоровья и готовности приложения
> 📖 **Подробная документация:** [API для проверки здоровья](docs/api/health.md)
#### Отладка
- `POST /api/v1/debug/dump` - Сохранить JSON данные для отладки
> 📖 **Подробная документация:** [API для отладки](docs/api/debug.md)
#### Jira
**Примечание:** Создание тикетов в Jira происходит автоматически при получении алертов (внутренний процесс). API endpoints для создания тикетов вручную удалены в соответствии с требованиями.
> 📖 **Подробная документация:** [Конфигурация Jira Mapping](docs/jira-mapping.md)
### Настройка Webhooks
> 📖 **Подробная документация:**
> - [Настройка Grafana](docs/monitoring/grafana.md)
> - [Настройка Zabbix](docs/monitoring/zabbix.md)
> - [Настройка AlertManager](docs/monitoring/alertmanager.md)
## Интеграция с Jira
### Настройка Jira
> 📖 **Подробная документация:** [Конфигурация Jira Mapping](docs/jira-mapping.md)
**Примечание:** Создание тикетов в Jira происходит автоматически при получении алертов (внутренний процесс). API endpoints для создания тикетов вручную удалены в соответствии с требованиями.
## Стоп-слова
Приложение поддерживает фильтрацию алертов по стоп-словам. Алерты, содержащие следующие паттерны, не будут отправлены:
- `InfoInhibitor`
- `Watchdog`
- `etcdHighCommitDurations`
- `etcdHighNumberOfFailedGRPCRequests`
- `kubePersistentVolumeFillingUp`
- `kubePersistentVolumeInodesFillingUp`
## Метрики Prometheus
Приложение отправляет метрики в Prometheus Pushgateway:
- `tg_monitoring_gateway_api_endpoint_total` - общее количество обращений к эндпоинтам API
- `tg_monitoring_gateway_total_messages` - всего сообщений получено
- `tg_monitoring_gateway_sent_messages` - сообщений успешно отправлено
- `tg_monitoring_gateway_reject_messages` - сообщений отклонено (стоп-слова)
- `tg_monitoring_gateway_error_messages` - ошибок отправки сообщений
- `tg_monitoring_gateway_firing_messages` - горящих алертов
- `tg_monitoring_gateway_critical_messages` - критических алертов
- `tg_monitoring_gateway_resolved_messages` - исправленных алертов
- `tg_monitoring_gateway_jira_tickets_created` - Jira тикетов создано
- `tg_monitoring_gateway_jira_tickets_errors` - ошибок создания Jira тикетов
## Отправка простых сообщений
> 📖 **Подробная документация:** [API для отправки сообщений](docs/api/message.md)
Приложение поддерживает отправку простых сообщений (текст, фото, видео, аудио, документы) в мессенджеры (Telegram, MAX/VK) без привязки к системам мониторинга.
## Разработка
### Запуск в режиме разработки
```bash
make dev
```
### Запуск тестов
```bash
make test
```
### Линтинг
```bash
make lint
```
### Форматирование кода
```bash
make format
```
### Просмотр всех доступных команд
```bash
make help
```
### Проверка здоровья приложения
```bash
make health # Проверить здоровье
make ready # Проверить готовность
```
### Управление Docker образами
```bash
# Использование через переменную CMD
make docker CMD=build # Собрать образ
make docker CMD=tag # Тегировать образ
make docker CMD=push # Отправить образ в registry
# Или напрямую
make docker-build # Собрать образ
make docker-tag # Тегировать образ
make docker-push # Отправить образ в registry
# Или через обертку
./make-wrapper.sh docker build
./make-wrapper.sh docker push
```
### Работа с Git
```bash
# Использование через переменную CMD
make git CMD=status # Показать статус
make git CMD=pull # Получить изменения
make git CMD=push ARGS=origin main # Отправить изменения
make git CMD=add ARGS=file1 file2 # Добавить файлы
make git CMD=commit ARGS="message" # Создать коммит
# Или напрямую
make git-status
make git-pull
make git-push
# Или через обертку
./make-wrapper.sh git status
./make-wrapper.sh git push origin main
./make-wrapper.sh git commit "Update README"
```
### Работа с Kubernetes
```bash
# Показать доступные контексты
make k8s CMD=contexts
# или
make k8s-contexts
# или
./make-wrapper.sh k8s contexts
# Установить контекст
make k8s CMD=set-context CONTEXT=prod
# или
make k8s-set-context CONTEXT=prod
# или
./make-wrapper.sh k8s set-context CONTEXT=prod
# Применить манифесты
make k8s CMD=apply
# или с указанием контекста
make k8s CMD=apply CONTEXT=prod
# или
make k8s-apply
# или
./make-wrapper.sh k8s apply CONTEXT=prod
# Показать статус подов
make k8s CMD=status
# или
make k8s-status
# Показать логи подов
make k8s CMD=logs
# или
make k8s-logs
# Открыть shell в поде
make k8s CMD=shell
# или
make k8s-shell
```
### Работа с .env файлом
```bash
# Проверить наличие .env файла
make env CMD=check
# или
make env-check
# или
./make-wrapper.sh env check
# Создать .env файл из env.example
make env CMD=create
# или
make env-create
# или
./make-wrapper.sh env create
# Принудительно создать .env файл
make env CMD=create-force
# или
make env-create-force
# или
./make-wrapper.sh env create-force
```
## Развертывание в Kubernetes
1. Создайте Secret с переменными окружения:
```bash
kubectl create secret generic message-gateway-secret \
--from-literal=telegram_bot_token=your_token \
--from-literal=grafana_url=http://grafana.example.com \
--from-literal=jira_enabled=true \
--from-literal=jira_url=https://jira.example.com \
--from-literal=jira_email=user@example.com \
--from-literal=jira_api_token=your_jira_api_token \
-n message-gateway
```
2. Примените манифесты:
```bash
# Использование make
make k8s CMD=apply
# или с указанием контекста
make k8s CMD=apply CONTEXT=prod
# или напрямую
make k8s-apply
# или через обертку
./make-wrapper.sh k8s apply CONTEXT=prod
# Или напрямую через kubectl
kubectl apply -f kubernetes.yaml
```
## Структура проекта
```
message-gateway/
├── app/
│ ├── api/
│ │ └── v1/
│ │ ├── endpoints/ # Эндпоинты API
│ │ │ ├── jira.py # Эндпоинты Jira
│ │ │ ├── message.py # Эндпоинты для отправки сообщений
│ │ │ ├── groups.py # Эндпоинты для управления группами
│ │ │ └── ...
│ │ └── router.py # Роутер API
│ ├── core/ # Основные утилиты
│ │ ├── config.py # Конфигурация
│ │ ├── telegram_client.py # Клиент Telegram
│ │ ├── jira_client.py # Клиент Jira
│ │ ├── jira_mapping.py # Управление маппингом Jira
│ │ ├── jira_utils.py # Утилиты для работы с Jira
│ │ ├── groups.py # Управление группами
│ │ ├── metrics.py # Метрики Prometheus
│ │ └── utils.py # Вспомогательные утилиты
│ ├── models/ # Модели Pydantic
│ │ ├── jira.py # Модели Jira
│ │ ├── message.py # Модели для отправки сообщений
│ │ ├── group.py # Модели для управления группами
│ │ ├── grafana.py # Модели Grafana
│ │ ├── zabbix.py # Модели Zabbix
│ │ ├── alertmanager.py # Модели AlertManager
│ │ └── ...
│ ├── modules/ # Модули обработки алертов
│ └── main.py # Точка входа приложения
├── config/ # Конфигурационные файлы
│ ├── groups.json # Конфигурация групп Telegram
│ └── jira_mapping.json # Конфигурация маппинга Jira
├── templates/ # Jinja2 шаблоны
│ ├── jira_common.tmpl # Шаблон описания Jira тикета
│ └── ...
├── docker-compose.yaml # Docker Compose конфигурация
├── Dockerfile # Docker образ
├── Makefile # Makefile для управления проектом
├── make-wrapper.sh # Обертка для поддержки подкоманд с пробелами
├── kubernetes.yaml # Kubernetes манифесты
├── requirements.txt # Python зависимости
├── env.example # Пример файла окружения
└── README.md # Документация
```
## Лицензия
Apache 2.0
## Контакты
- **Автор:** Сергей Антропов
- **Email:** sergey@antropoff.ru
- **Сайт:** https://devops.org.ru