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

642
README.md Normal file
View File

@@ -0,0 +1,642 @@
# 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