Документация Каналы уведомлений

Каналы уведомлений

Mockarty поддерживает отправку уведомлений через внешние мессенджеры — Telegram, Slack, Discord, Microsoft Teams и другие. Пользователи получают оповещения о результатах тестов, анномалиях фаззинга, дрейфе контрактов и системных событиях прямо в привычный мессенджер.

Архитектура

Система уведомлений использует двухуровневую модель:

  1. Администратор настраивает системные каналы (напр. “Корпоративный Slack”, “Telegram бот”)
  2. Пользователи подключаются к доступным каналам и настраивают, какие события хотят получать

Кроме того, AI-агент может использовать системные каналы для отправки уведомлений без необходимости указывать credentials.

АДМИНИСТРАТОР Настройка каналов Добавить Тест / Удалить настраивает СИСТЕМНЫЕ КАНАЛЫ Telegram Slack Discord Teams + PagerDuty, OpsGenie, Webex... ПОЛЬЗОВАТЕЛЬ Настройки → Мои каналы Подключить Предпочтения привязка ШИНА СОБЫТИЙ test.run.completed | fuzzing.finding.new | contract.drift_detected | system.alert ДИСПЕТЧЕР КАНАЛОВ событие → привязки пользователя → отправка проверка предпочтений Telegram Slack Discord Teams PagerDuty Webhook ... AI Агент send_via_channel прямая отправка

Поддерживаемые каналы

Канал Тип Как работает
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 подписью

Настройка администратором

Добавление канала

  1. Откройте Админ-панель → Каналы уведомлений
  2. Нажмите Добавить канал
  3. Выберите тип канала
  4. Заполните конфигурацию (следуйте подсказкам для каждого типа)
  5. (Опционально) Укажите Namespace — оставьте пустым, чтобы сделать канал глобальным (виден в каждом namespace), либо введите конкретное имя namespace, чтобы ограничить область видимости. Это поле можно безопасно изменить позднее через обновление.
  6. Нажмите Сохранить
  7. Используйте кнопку Тест для проверки подключения

Обновление канала (без раскрытия секретов)

При редактировании существующего канала не нужно повторно вводить токены, 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

  1. Откройте Telegram, найдите @BotFather
  2. Отправьте /newbot, следуйте инструкциям для создания бота
  3. Скопируйте токен бота (формат: 123456789:ABCdef...)
  4. В Mockarty Админ → Каналы → Добавить → Telegram:
    • Bot Token: вставьте токен
    • Bot Username: @YourBotName (опционально, для отображения)
  5. Сохраните и включите

Пользователи подключатся нажав deeplink, который откроет бота в Telegram.

Slack

Вариант А: Bot Token (рекомендуется для личных сообщений)

  1. Перейдите на api.slack.com/apps → Create New App
  2. Добавьте Bot Token Scopes: chat:write, users:read.email
  3. Установите в workspace, скопируйте Bot Token (xoxb-...)
  4. В Mockarty: вставьте как Bot Token

Пользователи вводят свой email Slack для получения DM.

Вариант Б: Incoming Webhook (уровень канала)

  1. В Slack App → Incoming Webhooks → Add New Webhook
  2. Выберите канал, скопируйте URL
  3. В Mockarty: вставьте как Webhook URL

Discord

  1. В Discord: Настройки сервера → Интеграции → Вебхуки → Создать вебхук
  2. Выберите канал, скопируйте URL вебхука
  3. В Mockarty: вставьте как Webhook URL

Привязка к пользователю не нужна — сообщения идут в канал.

Microsoft Teams

  1. В канале Teams: нажмите ... → Workflows
  2. Выберите “Post to a channel when a webhook request is received”
  3. Пройдите мастер настройки, скопируйте URL
  4. В Mockarty: вставьте как Webhook URL

Примечание: Старые URL коннекторов Office 365 выводятся из эксплуатации. Используйте Workflows (Power Automate).

PagerDuty

  1. В PagerDuty: Services → выберите сервис → вкладка Integrations
  2. Add Integration → Events API v2
  3. Скопируйте Integration Key
  4. В Mockarty: вставьте как Integration Key (routing_key)
  5. Опционально: укажите Severity — одно из critical, error, warning, info (если не указано, применяется значение по умолчанию для типа события)

OpsGenie

  1. В OpsGenie: Teams → выберите команду → Integrations → Add integration → API
  2. Скопируйте API Key
  3. В Mockarty: вставьте как API Key
  4. Выберите Regionus (api.opsgenie.com) или eu (api.eu.opsgenie.com). Неверный регион приводит к молчаливым сбоям доставки.

Тестирование канала

После сохранения нажмите кнопку Test на любом канале, чтобы отправить тестовое уведомление. Для каналов, требующих получателя (Telegram, Slack), потребуется указать chat ID или email.

Настройка пользователем

Подключение к каналам

  1. Перейдите в Настройки → Мои каналы уведомлений
  2. Доступные каналы от администратора отображаются в Доступные каналы
  3. Нажмите Подключить на нужном канале

Подключение Telegram

  1. Нажмите Подключить на канале Telegram
  2. Откроется deeplink — нажмите, чтобы перейти к боту в Telegram
  3. Нажмите Start в чате с ботом
  4. Подключение подтверждается автоматически

Подключение Slack

  1. Нажмите Подключить на канале Slack
  2. Введите ваш email в workspace Slack
  3. 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-команду (боту не нужно оставаться на связи):

  1. В админке Mockarty добавьте канал Mattermost и заполните Server URL + Slash Command Token (токен получите из Mattermost на следующем шаге).
  2. В Mattermost: Integrations → Slash Commands → Add — команда с триггером mockarty, Request URL https://<ваш-mockarty>/api/v1/messenger/webhook/mattermost/<id-канала>, метод POST. Mattermost покажет Token команды — вставьте его в поле Slash Command Token канала Mockarty и сохраните.
  3. Пользователи пишут /mockarty <команда> (например /mockarty ask как замокать gRPC). Ответ команды виден только отправителю; ссылка на встречу публикуется в канал.

Поле Webhook URL остаётся опциональным — задайте его, если также нужны исходящие уведомления; интерактивный бот работает от Server URL + Slash Command Token.

Настройка бота Rocket.Chat

Rocket.Chat управляет ботом через исходящий вебхук (у Rocket.Chat нет интеграции slash-команд как у Mattermost):

  1. В админке Mockarty добавьте канал Rocket.Chat и заполните Server URL + Outgoing Webhook Token (токен получите из Rocket.Chat на следующем шаге).
  2. В Rocket.Chat: Admin → Integrations → New → Outgoing — событие Message Sent, триггер-слово mockarty, URL https://<ваш-mockarty>/api/v1/messenger/rocketchat/outgoing/<id-канала>. Rocket.Chat покажет Token — вставьте его в поле Outgoing Webhook Token канала Mockarty и сохраните.
  3. Пользователи пишут mockarty <команда> (например mockarty ask как замокать gRPC). Поскольку ответы исходящего вебхука публичны, вывод команды публикуется в комнату.
  4. Дополнительно задайте 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:

  1. list_system_channels — возвращает доступные каналы с ID
  2. send_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.

Шаблоны сообщений по типам событий

Диспетчер рендерит каждое уведомление через шаблонный движок с поддержкой переопределений. Порядок поиска (от самого конкретного к наименее):

  1. (eventType, channelType, lang) – полностью конкретное переопределение
  2. (eventType, channelType, "") – любой язык
  3. (eventType, "", lang) – любой канал
  4. (eventType, "", "") – любой канал, любой язык
  5. Встроенное значение по умолчанию из кода

Шаблоны используют синтаксис 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 Обновить предпочтение

Смотрите также