Каналы уведомлений
Mockarty поддерживает отправку уведомлений через внешние мессенджеры — Telegram, Slack, Discord, Microsoft Teams и другие. Пользователи получают оповещения о результатах тестов, анномалиях фаззинга, дрейфе контрактов и системных событиях прямо в привычный мессенджер.
Архитектура
Система уведомлений использует двухуровневую модель:
- Администратор настраивает системные каналы (напр. “Корпоративный Slack”, “Telegram бот”)
- Пользователи подключаются к доступным каналам и настраивают, какие события хотят получать
Кроме того, AI-агент может использовать системные каналы для отправки уведомлений без необходимости указывать credentials.
Поддерживаемые каналы
| Канал | Тип | Как работает |
|---|---|---|
| Telegram | Bot API | Админ создаёт бота через @BotFather, пользователи подключаются через deeplink |
| Slack | Bot Token / Webhook | DM через bot token + поиск по email, или webhook в канал |
| Discord | Webhook | Webhook уровня канала, привязка к пользователю не нужна |
| Microsoft Teams | Workflow Webhook | Adaptive Card через Power Automate Workflow |
| Mattermost | Webhook | Slack-совместимый входящий вебхук |
| Rocket.Chat | Webhook | Slack-совместимый входящий вебхук |
| Пачка (Pachca) | Bot API | Личные сообщения через бот-API Пачки |
| VK Teams | Bot API | Сообщения через VK Teams Bot API (поддерживается self-hosted адрес API) |
| PagerDuty | Events API v2 | Создаёт инциденты для критичных алертов |
| OpsGenie | Alert API | Создаёт алерты с маппингом приоритетов |
| Google Chat | Webhook | Webhook уровня пространства |
| Webex | Bot API | DM через bot token + email |
| Generic Webhook | HTTP POST | Любой URL с опциональной HMAC подписью |
Настройка администратором
Добавление канала
- Откройте Админ-панель → Каналы уведомлений
- Нажмите Добавить канал
- Выберите тип канала
- Заполните конфигурацию (следуйте подсказкам для каждого типа)
- (Опционально) Укажите Namespace — оставьте пустым, чтобы сделать канал глобальным (виден в каждом namespace), либо введите конкретное имя namespace, чтобы ограничить область видимости. Это поле можно безопасно изменить позднее через обновление.
- Нажмите Сохранить
- Используйте кнопку Тест для проверки подключения
Обновление канала (без раскрытия секретов)
При редактировании существующего канала не нужно повторно вводить токены, webhook URL или другие чувствительные поля — UI отправляет пустую строку для полей, которые вы оставили незаполненными, а сервер сохраняет ранее записанное значение для них. Перезаписываются только те поля, которые вы действительно заполнили. Это позволяет переименовать канал, переключить его enabled, или перенести между namespace без повторного раскрытия секретов.
Журнал аудита администратора
Каждое изменение канала, инициированное администратором, записывается в журнал аудита (просмотр в Админ-панель → Журнал аудита). Три кода действий идентифицируют события:
| Действие | Когда срабатывает | Захватываемые поля |
|---|---|---|
create_notification_channel |
Новый канал сохранён | type, name, enabled, актор, IP, namespace |
update_notification_channel |
Успешный PUT канала | type, name, enabled, актор, IP, namespace |
delete_notification_channel |
Успешный DELETE канала | type, name (снимок перед удалением), актор, IP, namespace |
Секретные поля (токены ботов, webhook URL, пароли) никогда не попадают в журнал аудита — записываются только публичные метаданные. Используйте этот журнал, чтобы отследить, кто настроил канал, когда он был отключён или какой администратор удалил получателя, переставшего получать алерты.
Примеры настройки
Telegram
- Откройте Telegram, найдите @BotFather
- Отправьте
/newbot, следуйте инструкциям для создания бота - Скопируйте токен бота (формат:
123456789:ABCdef...) - В Mockarty Админ → Каналы → Добавить → Telegram:
- Bot Token: вставьте токен
- Bot Username:
@YourBotName(опционально, для отображения)
- Сохраните и включите
Пользователи подключатся нажав deeplink, который откроет бота в Telegram.
Slack
Вариант А: Bot Token (рекомендуется для личных сообщений)
- Перейдите на api.slack.com/apps → Create New App
- Добавьте Bot Token Scopes:
chat:write,users:read.email - Установите в workspace, скопируйте Bot Token (
xoxb-...) - В Mockarty: вставьте как Bot Token
Пользователи вводят свой email Slack для получения DM.
Вариант Б: Incoming Webhook (уровень канала)
- В Slack App → Incoming Webhooks → Add New Webhook
- Выберите канал, скопируйте URL
- В Mockarty: вставьте как Webhook URL
Discord
- В Discord: Настройки сервера → Интеграции → Вебхуки → Создать вебхук
- Выберите канал, скопируйте URL вебхука
- В Mockarty: вставьте как Webhook URL
Привязка к пользователю не нужна — сообщения идут в канал.
Microsoft Teams
- В канале Teams: нажмите
...→ Workflows - Выберите “Post to a channel when a webhook request is received”
- Пройдите мастер настройки, скопируйте URL
- В Mockarty: вставьте как Webhook URL
Примечание: Старые URL коннекторов Office 365 выводятся из эксплуатации. Используйте Workflows (Power Automate).
PagerDuty
- В PagerDuty: Services → выберите сервис → вкладка Integrations
- Add Integration → Events API v2
- Скопируйте Integration Key
- В Mockarty: вставьте как Integration Key (
routing_key) - Опционально: укажите Severity — одно из
critical,error,warning,info(если не указано, применяется значение по умолчанию для типа события)
OpsGenie
- В OpsGenie: Teams → выберите команду → Integrations → Add integration → API
- Скопируйте API Key
- В Mockarty: вставьте как API Key
- Выберите Region —
us(api.opsgenie.com) илиeu(api.eu.opsgenie.com). Неверный регион приводит к молчаливым сбоям доставки.
Тестирование канала
После сохранения нажмите кнопку Test на любом канале, чтобы отправить тестовое уведомление. Для каналов, требующих получателя (Telegram, Slack), потребуется указать chat ID или email.
Настройка пользователем
Подключение к каналам
- Перейдите в Настройки → Мои каналы уведомлений
- Доступные каналы от администратора отображаются в Доступные каналы
- Нажмите Подключить на нужном канале
Подключение Telegram
- Нажмите Подключить на канале Telegram
- Откроется deeplink — нажмите, чтобы перейти к боту в Telegram
- Нажмите Start в чате с ботом
- Подключение подтверждается автоматически
Подключение Slack
- Нажмите Подключить на канале Slack
- Введите ваш email в workspace Slack
- Mockarty найдёт ваш Slack ID и будет отправлять DM напрямую
Webhook-каналы (Discord, Teams и др.)
Эти каналы настраиваются на уровне канала — нажмите Подключить, и всё готово. Все пользователи, подключённые к одному и тому же каналу, получают одинаковые сообщения.
Матрица предпочтений
После подключения настройте, какие события вызывают уведомления. Матрица предпочтений показывает все события, доставляемые в каналы (их десятки), сгруппированные по категориям — прогоны тестов, нагрузка, фаззинг, контракты, упоминания и личные сообщения в чате, встречи, трекер задач, ревью, лицензия и системные алерты. У каждой колонки-канала есть переключатель «Все» — включить/выключить весь канал одним кликом, а каждое событие настраивается по каналам индивидуально.
Несколько примеров канонических ID событий:
| ID события | Описание |
|---|---|
test.run.completed |
Прогон коллекции API-тестов завершён |
perf.test.failed |
Нагрузочный тест не смог доработать до конца |
perf.test.threshold_breach |
Нагрузочный тест завершился, но один или несколько порогов не выдержаны |
fuzzing.finding.new |
Фаззер обнаружил новую уязвимость или аномалию |
contract.drift_detected |
Обнаружен дрейф контракта между записанным и live-ответом |
system.alert |
Системный инцидент (сбой очистки, проблема с лицензией, исчерпание ресурсов) |
Полный актуальный список отдаёт GET /api/v1/channels/preferences (поле eventTypes) — UI строит матрицу из него, поэтому новые типы событий появляются автоматически.
Эскалация непрочитанных уведомлений
Если уведомление в «колокольчике» слишком долго остаётся непрочитанным, Mockarty может эскалировать его дайджестом в один из подключённых мессенджеров. Включается в Настройки → Мои каналы уведомлений → Эскалация: выберите целевой канал и порог (сколько уведомление может оставаться непрочитанным до эскалации). Функция опциональна и по умолчанию выключена; для включения нужен хотя бы один подключённый канал.
API: GET /api/v1/notifications/escalation / PUT /api/v1/notifications/escalation.
Боты мессенджеров — двусторонние команды
Каналы Telegram, Slack, VK Teams, Mattermost и Rocket.Chat — не только исходящая труба: когда канал настроен для интерактива, бот также принимает команды — одинаковый набор на всех мессенджерах.
Подключение аккаунта
Бот действует только от имени известных ему пользователей:
- Telegram — подключение из Настройки → Мои каналы уведомлений (deeplink → нажать Start).
- VK Teams — получите connect-токен в Настройки → Мои каналы уведомлений и отправьте боту
/start <токен>. - Slack — запросите одноразовый код через
POST /api/v1/channels/slack/connect(или кнопку «Подключить» в настройках), затем отправьте боту в личкуconnect <код>. - Mattermost — получите connect-токен в Настройки → Мои каналы уведомлений и отправьте
/mockarty link <токен>в Mattermost.
Незнакомый пользователь, написавший боту, получает инструкцию по подключению, а не сухой отказ.
Настройка бота Mattermost
Mattermost управляет ботом через slash-команду (боту не нужно оставаться на связи):
- В админке Mockarty добавьте канал Mattermost и заполните Server URL + Slash Command Token (токен получите из Mattermost на следующем шаге).
- В Mattermost: Integrations → Slash Commands → Add — команда с триггером
mockarty, Request URLhttps://<ваш-mockarty>/api/v1/messenger/webhook/mattermost/<id-канала>, метод POST. Mattermost покажет Token команды — вставьте его в поле Slash Command Token канала Mockarty и сохраните. - Пользователи пишут
/mockarty <команда>(например/mockarty ask как замокать gRPC). Ответ команды виден только отправителю; ссылка на встречу публикуется в канал.
Поле Webhook URL остаётся опциональным — задайте его, если также нужны исходящие уведомления; интерактивный бот работает от Server URL + Slash Command Token.
Настройка бота Rocket.Chat
Rocket.Chat управляет ботом через исходящий вебхук (у Rocket.Chat нет интеграции slash-команд как у Mattermost):
- В админке Mockarty добавьте канал Rocket.Chat и заполните Server URL + Outgoing Webhook Token (токен получите из Rocket.Chat на следующем шаге).
- В Rocket.Chat: Admin → Integrations → New → Outgoing — событие Message Sent, триггер-слово
mockarty, URLhttps://<ваш-mockarty>/api/v1/messenger/rocketchat/outgoing/<id-канала>. Rocket.Chat покажет Token — вставьте его в поле Outgoing Webhook Token канала Mockarty и сохраните. - Пользователи пишут
mockarty <команда>(напримерmockarty ask как замокать gRPC). Поскольку ответы исходящего вебхука публичны, вывод команды публикуется в комнату. - Дополнительно задайте Bot Auth Token + Bot User ID (personal-access-token бот-пользователя Rocket.Chat), чтобы включить membership-guard и ретрансляцию звонков через REST API.
Поле Webhook URL остаётся опциональным — задайте его, если также нужны исходящие уведомления; интерактивный бот работает от Server URL + Outgoing Webhook Token.
Команды
| Команда | Что делает |
|---|---|
/menu |
Быстрые действия inline-кнопками (новая встреча, задачи, статус, помощь) |
/meet |
Создать ссылку на видеовстречу (встреча в Обсуждениях) |
/tasks |
Ваши открытые задачи из трекера |
/do <запрос> |
Поручить задачу AI-агенту Mockarty |
/ask <вопрос> |
Спросить базу знаний |
/status |
Статус бота |
/help |
Все команды |
В групповых чатах обращайтесь к боту как /команда@ИмяБота (Telegram) или упоминанием (Slack @bot, VK Teams). Slack дополнительно поддерживает slash-команды через настраиваемый endpoint и всегда проверяет подписи запросов через Signing Secret канала.
Голосовые сообщения (Telegram, VK Teams)
Отправьте боту голосовое (или аудиофайл; в Telegram — и видео-кружок) — он распознает речь механизмами Mockarty и поступит по смыслу:
- В личной переписке распознанный текст становится задачей для AI-агента Mockarty — «голосовой
/do». Бот отвечает, что услышал, передаёт задачу агенту под вашей учётной записью и публикует ответ агента в чат, когда тот закончит. Если на стенде доступен синтез речи, ответ также приходит голосовым сообщением (Telegram и VK Teams) — спросили голосом, услышали ответ. Требуется привязка Telegram к аккаунту Mockarty. - В группе бот публикует транскрипт для всех. Если группа привязана к обсуждению (
/link), транскрипт попадает и в накопленную историю —/summarizeи/topicsучитывают сказанное голосом.
Принимаются голосовые до 10 минут. Транскрипция должна быть доступна на стенде (распознающий раннер онлайн или настроен внешний API распознавания) — иначе бот честно сообщит об этом.
Привязка группового чата к обсуждению
Группу Telegram, VK Teams или Slack можно привязать к обсуждению Mockarty: создайте токен из панели обсуждения (Синхронизация → <мессенджер>) и отправьте в группе /link <токен>. После этого бот хранит недавнюю историю, /summarize публикует дайджест в привязанное обсуждение, а /topics сегментирует накопленную историю в темы базы знаний.
В Slack привязка дополнительно требует подписки приложения на событие message.channels и присутствия бота в канале — так бот видит переписку, которую буферизует для /summarize и /topics.
Модерация групп
В группах боты Telegram и VK Teams могут охранять членство полным набором /guard off | warn | grace | kick. Slack поддерживает /guard off | warn | kick (привязанный пользователь включает; бот предупреждает — или удаляет с правом channels:manage и событием member_joined_channel — неавторизованного вошедшего); grace доступен в Telegram и VK Teams. Mattermost тоже поддерживает /mockarty guard off | warn | kick, но — так как Mattermost не даёт боту событий входа — охрана работает периодическим опросом состава и потому требует опционального bot-токена (бот-аккаунт с manage_channel_members) в поле Bot Token канала; без него охрана выключена. Менять политику может только администратор чата — кроме Slack, где это может любой участник с подключённым к Mockarty аккаунтом: в Slack нет понятия администратора канала, которое бот мог бы проверить. В режиме grace новичок, не подключённый к Mockarty, получает приветствие и окно времени на подключение, после чего удаляется; warn только предупреждает, kick удаляет сразу, off выключает охрану. Администраторы чата всегда защищены — охрана никогда не предупреждает и не удаляет администратора (и самого бота), поэтому включённый kick не тронет тех, кто управляет чатом.
Режим доставки Telegram: pull или webhook
По умолчанию Telegram-бот опрашивает обновления (работает без входящей связности). Для меньшей задержки канал можно переключить в режим webhook — Mockarty зарегистрирует вебхук в Telegram и будет принимать обновления на публичном endpoint, защищённом автоматически сгенерированным секретом:
POST /api/v1/admin/channels/:id/telegram/webhook
{"enabled": true} # включить webhook (rotateSecret: true — перевыпустить секрет)
Режим также редактируется в форме настроек канала (Mode: pull / webhook). Переключение туда-обратно не требует рестарта.
Интеграция с AI-агентом
AI-агент (сабагент-нотификатор) может отправлять уведомления через системные каналы без credentials:
list_system_channels— возвращает доступные каналы с IDsend_via_channel— отправляет уведомление через канал по ID
Пример диалога с агентом:
Пользователь: "Отправь сводку результатов тестов за сегодня в Slack"
Агент: [вызывает list_system_channels → находит канал Slack]
Агент: [вызывает send_via_channel с channel_id, title, text]
Без AI-агента
Система уведомлений полностью работает без AI-агента:
- Автоматические уведомления: События (завершение тестов, аномалии фаззинга и т.д.) автоматически рассылаются через EventBus → Channel Dispatcher
- Предпочтения пользователя: Управляйте маршрутизацией через матрицу предпочтений
- Администраторские рассылки: Админ может тестировать каналы прямо из админ-панели
API Endpoints
API администратора
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/admin/channels |
Список всех каналов |
| GET | /api/v1/admin/channels/types |
Поддерживаемые типы каналов |
| POST | /api/v1/admin/channels |
Создать канал |
| PUT | /api/v1/admin/channels/:id |
Обновить канал |
| DELETE | /api/v1/admin/channels/:id |
Удалить канал |
| POST | /api/v1/admin/channels/:id/test |
Тестировать канал |
| GET | /api/v1/admin/channel-delivery/dlq |
Список недоставленных сообщений |
| GET | /api/v1/admin/channel-delivery/retry-queue |
Очередь ожидающих повторов |
| POST | /api/v1/admin/channel-delivery/dlq/:id/requeue |
Вернуть запись из DLQ в очередь повторов |
| GET | /api/v1/admin/channel-templates |
Список шаблонов сообщений канала |
| POST | /api/v1/admin/channel-templates |
Создать/обновить шаблон сообщения |
| DELETE | /api/v1/admin/channel-templates/:id |
Удалить переопределение шаблона |
| POST | /api/v1/admin/channel-templates/preview |
Отрендерить шаблон на тестовом payload без сохранения |
| GET | /api/v1/admin/channel-templates/snippets |
Каталог готовых сниппетов для редактора шаблонов |
| GET | /api/v1/notifications/catalog |
Каталог зарегистрированных типов событий (используется UI-роутером) |
Надёжность доставки
Каждая попытка доставки записывается в channel_delivery_log со статусом, который проходит путь pending → delivered или pending → retrying → dead_letter при исчерпании max_retries. В админ-панели Каналы уведомлений → Журнал доставки доступны две вкладки:
- Недоставленные – доставки, которые использовали все попытки. Одним кликом можно вернуть запись обратно в очередь повторов.
- Очередь повторов – доставки, ожидающие следующей попытки, отсортированные по
next_retry_at.
Фоновый worker, работающий только на лидер-ноде, забирает из очереди просроченные записи, применяет экспоненциальную задержку и переводит строку в dead_letter как только retry_count >= max_retries.
Шаблоны сообщений по типам событий
Диспетчер рендерит каждое уведомление через шаблонный движок с поддержкой переопределений. Порядок поиска (от самого конкретного к наименее):
(eventType, channelType, lang)– полностью конкретное переопределение(eventType, channelType, "")– любой язык(eventType, "", lang)– любой канал(eventType, "", "")– любой канал, любой язык- Встроенное значение по умолчанию из кода
Шаблоны используют синтаксис Go text/template и имеют доступ к исходному payload события ({{ .Payload.fieldName }}), заголовку ({{ .Title }}), телу ({{ .Body }}) и глубокой ссылке ({{ .Link }}).
Переопределения управляются через Каналы уведомлений → Шаблоны сообщений в админ-интерфейсе или напрямую через endpoints /api/v1/admin/channel-templates.
API пользователя
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/channels |
Доступные каналы |
| GET | /api/v1/channels/bindings |
Мои привязки |
| POST | /api/v1/channels/bindings |
Подключиться к каналу |
| PUT | /api/v1/channels/bindings/:id |
Обновить привязку |
| DELETE | /api/v1/channels/bindings/:id |
Отключиться |
| POST | /api/v1/channels/telegram/connect |
Получить deeplink Telegram |
| GET | /api/v1/channels/preferences |
Получить предпочтения |
| PUT | /api/v1/channels/preferences |
Обновить предпочтение |
Смотрите также
- Вебхуки и обратные вызовы – Вебхуки уровня мока для HTTP, Kafka и RabbitMQ
- Руководство по интеграциям – Токены интеграции, ноды resolver, runner agent и CI/CD
- Руководство администратора – Управление пользователями, пространствами имён и системная конфигурация
- Справочник API – Полная документация REST API