
Основные понятия
- Alert — правило. Оно указывает что проверять (триггер), как часто (интервал оценки), когда считать неисправным (составная логика), насколько срочно (серьезность) и кого/куда уведомлять (каналы).
- Incident — что происходит, когда alert срабатывает. Один alert имеет максимум один открытый инцидент одновременно. Повторные нарушения обновляют доказательства того же инцидента. Инциденты разрешаются оператором; автоматическое разрешение при прекращении действия правила планируется, но не включено в настоящее время.
- Channel — место отправки уведомления: email, Slack, generic webhook или внутри панели. Каждый alert может использовать любую комбинацию.
default). Инциденты можно назначить отдельному оператору для сортировки.
Типы триггеров
Пять видов, каждый с собственной JSON-спецификацией. Выберите тот, который соответствует тому, как вы хотите описать “неисправность”. Форма new alert на панели мониторинга создает ту же спецификацию для вас, переключая редактор условий в соответствии с выбранным типом триггера:
1. metric_threshold
Самый простой. Выберите метрику из закрытого списка, оператор, пороговое значение и временное окно.
| Метрика | Что она считает |
|---|---|
event_count | Всего событий в окне |
error_count | event_type = 'error' ИЛИ любое событие с error_type IS NOT NULL |
error_rate | error_count / event_count (0..1) |
p95_latency_ms | quantile(0.95)(duration_ms) для всех событий с duration_ms |
p99_latency_ms | quantile(0.99)(duration_ms) |
token_sum | SUM(input_tokens + output_tokens) |
>, >=, <, <=, == (также принимаются как gt, gte, lt, lte, eq).
Необязательные фильтры: environment, event_type.
Пример спецификации:
2. custom_sql
Для всего, что не охватывают предустановленные метрики. SQL, предоставленный оператором, проходит через ту же защиту /queries/run (SELECT/WITH только, одно выражение, лимит 10 000 строк) перед запуском диспетчером. Два режима:
- rows mode (без
op/value): alert срабатывает, как только запрос вернет как минимум одну строку. - value mode: запрос должен давать одному столбцу псевдоним
metric_value; диспетчер сравниваетmetric_valueпервой строки сvalue, используяop.
3. evaluation_score
Читает agenteye.evaluations и сравнивает среднее значение именованной оценки в пределах окна.
min_count защищает от выбросов с одной выборкой; диспетчер не срабатывает, пока в окне не будет как минимум N оценок.
4. eval_compound
Перехватите регрессию качества, которая проявляется только во многих оценках оценивателя одновременно. Где evaluation_score отслеживает одну именованную оценку, eval_compound составляет несколько условий evaluation-score в один alert и объединяет их результаты с выбранной логикой; так что одно правило может выражать “срабатывай, если helpful падает или hallucination растет”, “срабатывай только если helpful и tool-efficiency оба падают”, или “срабатывай, если как минимум 2 из этих трех проверок нарушаются”.
Каждое условие читает среднее значение одной именованной оценки из agenteye.evaluations в пределах общего окна и тестирует его с собственным оператором и пороговым значением. Логические результаты затем объединяются с помощью combinator:
| Combinator | Логика | Срабатывает, когда |
|---|---|---|
"any" | ИЛИ | как минимум одно условие нарушено |
"all" | И | все условия нарушены |
{ "at_least": N } | M из N | как минимум N условий нарушены |
combinator:"any","all", или{ "at_least": N }.conditions[]: каждый{ score_key, op, value }, используя те же операторы, что и другие триггеры (>,>=,<,<=,==).window_secs: общий lookback, применяемый к каждому условию (по умолчанию3600).min_count: минимальное количество оценок на условие перед тем, как это условие может быть нарушено; условие с слишком малым количеством выборок в окне считается нарушенным (по умолчанию1).environment: необязательно; ограничивает каждое условие одной средой.
5. per_event
Для alerts типа “любое событие, соответствующее X, попало”. Без агрегации; диспетчер срабатывает, как только видит совпадение в окне lookback.
| Поле | Назначение |
|---|---|
agent_id | Ограничить ошибками от конкретного агента (тот, что показан на строке /errors). |
error_type | Ограничить определенным классом ошибок (например, TimeoutError) вместо каждой ошибки. |
message_contains | Совпадение подстроки без учета регистра против payload.message. Полезно для перехвата одного конкретного режима отказа (например, prompt is too long) без оповещения об каждой ошибке от одного агента. Ограничено 200 символами; сопоставляется как буквальная строка, не как шаблон. |
lookback_secs примерно соответствующим eval_interval_secs alert, чтобы не получить двойное уведомление об одном и том же событии.
Ярлык из /errors: каждая строка представителя группы ошибок на представлении ошибок (и панель деталей события сеанса для события ошибки) имеет кнопку + alert, которая открывает /alerts/new с предварительно заполненным триггером per_event, ключевым для event_type и среды этой строки, включая имя, полученное из error_type payload, когда присутствует. Вы все еще выбираете каналы и подтверждаете lookback, но средство сопоставления заполнено за вас. Операторы нуждаются в alerts:write для появления кнопки.
Составная логика (M из N)
Каждый alert имеет два целочисленных параметра в дополнение к триггеру:eval_window: количество последних оценок, на которые смотреть (по умолчанию 1)min_breaches: сколько из них должны быть нарушены перед срабатыванием alert (по умолчанию 1)
1 of 1 (по умолчанию) — это срабатывание при первом нарушении. 3 of 5 означает срабатывание, когда правило нарушено в 3 из последних 5 оценок, полезно для нестабильных сигналов, где одно плохое измерение является шумом. Диспетчер поддерживает кольцевой буфер для каждого alert; вам не нужно управлять состоянием.
Интервал оценки
eval_interval_secs контролирует, как часто диспетчер запускает ваше правило. Ограничено [30, 86400]. Предустановки на панели мониторинга: 1m / 5m / 15m / 1h. Выберите интервал, соответствующий скорости изменения основного сигнала: alert об ошибке за 5 минут, оцениваемый каждые 15 секунд, тратит ЦП впустую; alert per-event нуждается в коротком lookback или он будет молча пропускать события между тиками.
Каналы
Каждый alert может использовать любую комбинацию из этих четырех. Учетные данные по каналам (URL Slack webhook, generic webhook URL + signing secret, получатели email по умолчанию) настраиваются один раз в/settings и ссылаются по ключу из каждого alert. Таким образом, один канал Slack может служить множеству alerts без сохранения собственной копии URL webhook.
Три внешних типа каналов (email, Slack, webhook) также контролируются общим для организации переключателем отключения, alerts.enabled_channels. Когда срабатывающий alert присоединяет тип канала, который не входит в этот набор, диспетчер пропускает его и записывает строку alert_notifications со статусом skipped_disabled и целевым <channel_disabled> (позволяя вам глобально приостановить, например, всю доставку Slack без редактирования каждого правила). Канал внутри панели всегда разрешен. Смотрите Конфигурация.
- Переопределение
recipients[]для каждого канала (когда не пусто). - Параметр
alerts.email_default_recipients(массив строк email).
alert_notifications с целевым <smtp_unconfigured>, так что журнал аудита делает неправильную конфигурацию видимой.
Slack
Отправляет Block Kit-сообщение на incoming webhook URL.- URL по умолчанию:
alerts.slack_default_webhook(установлено в/settings). - Переопределение для каждого alert: установите
webhook_setting_keyканала на любой другой ключ параметра типа URL, например,alerts.slack_oncall,alerts.slack_costs.
:rotating_light: / :warning: / :bell:), и сообщение содержит кнопку, которая глубоко ссылается на страницу инцидента.
Generic webhook
Интеграция JSON-POST для PagerDuty, Opsgenie или вашей собственной конечной точки приема. Форма тела:alerts.webhook_signing_secret, запрос включает заголовок X-AgentEye-Signature: sha256=<hex>, HMAC-SHA256 тела с использованием секрета. Проверьте его на стороне получателя перед доверием payload.
Заголовок X-AgentEye-Event содержит alert.firing / alert.test. (alert.resolved зарезервирован для планируемой функции авторазрешения и в настоящее время не передается.)
Внутри панели
Без внешней доставки: alert просто записывает строкуalert_notifications, которую страница инцидентов панели отображает. Полезно при настройке правила и вы не хотите спамить внешнюю систему, или для неспешных alerts, которые операторы проверяют при обычной сортировке.
Жизненный цикл инцидента
- firing — диспетчер только что открыл инцидент или обнаружил другое нарушение. Уведомление о срабатывании разветвляется ровно один раз (контролируется временной меткой
notified_firing_atинцидента). - acknowledged — оператор нажал ack на
/incidents/:id. Инцидент по-прежнему считается открытым; последующие нарушения обновят его доказательства без повторного уведомления. - resolved — оператор нажал resolve. Автоматическое разрешение при прекращении нарушения правила планируется, но в настоящее время не включено, поэтому открытый инцидент остается открытым, пока оператор его не разрешит.


Требуемые разрешения
Создание alert-правил и сортировка инцидентов — это отдельные проблемы с отдельными разрешениями, поэтому вы можете дать доступ к инцидентам дежурной ротации без передачи ей возможности переписывать правила.alerts:read: просмотр alert-правил.alerts:write: создание, редактирование, удаление alert-правил и активирование тестового уведомления.incidents:read: просмотр инцидентов.incidents:write: открытие ручных (ad-hoc) инцидентов, не связанных с alert.incidents:ack: подтверждение, назначение, комментирование и разрешение инцидентов.
УстаревшийПредоставьте на API-ключи (alerts:ack. Ключи и операторы, которым было предоставлено более старое разрешениеalerts:ack, продолжают работать: оно принимается какincidents:ack(и подразумеваетincidents:read), поэтому существующие дежурные операторы сохраняют свой доступ без переизданий учетных данных. Выпускайте новые разрешения с семействомincidents:*.
POST /keys) и операторов (PUT /users/:id). PermGate панели блокирует соответствующие кнопки при отсутствии разрешения; вы увидите // 403 рядом с действием.
Средство выбора получателя Email. Средство выбора получателей редактора alert отображает членов вашей организации, так что вы можете выбрать их по имени. Он загружается для любого оператора, имеющегоalerts:readилиalerts:write; просмотр каталога вашей команды для этой цели не требуетusers:read, и средство выбора возвращает только адреса email членов, никогда полные записи пользователей.
Конфигурация
Переменные окружения, используемые диспетчером:| Переменная | По умолчанию | Назначение |
|---|---|---|
ALERT_WORKERS | 1 | Рабочие задачи на экземпляр сервера. Большинство развертываний нуждаются только в одной. |
ALERT_CLAIM_BATCH | 16 | Макс alert-ы, которые один рабочий тик обрабатывает. |
ALERT_POLL_IDLE_SECS | 5 | Сон рабочего при пустой очереди. |
ALERT_REQUEST_TIMEOUT_MS | 15000 | Тайм-аут оценки на триггер. |
DASHBOARD_URL | https://app.befailproof.ai | Источник, используемый для построения magic-link инцидента в уведомлениях. Установите на вашего хоста панели. |
/settings, не env):
alerts.email_default_recipients(email_list): JSON-массив строк email — получатели по умолчанию для email-каналов.alerts.slack_default_webhook(url): URL Slack incoming-webhook по умолчанию.alerts.webhook_default_url(url): URL generic-webhook по умолчанию.alerts.webhook_signing_secret(secret): ключ HMAC-SHA256. Всегда возвращается как""в ответе GET; введите новое значение для ротации.alerts.enabled_channels(channel_set): набор внешних типов каналов для организации, которые отправляются при срабатывании alert; по умолчанию все три (email,slack,webhook). Удаление типа здесь глобально подавляет этот канал для каждого alert без редактирования каждого правила. Канал внутри панели всегда доставляется и не затрагивается этим параметром.
Проверка нового alert
Перед использованием нового alert:- Сохраните его как включенный с как минимум одним каналом уведомления.
- Выберите test на странице деталей alert и подтвердите, что каждое настроенное место назначения получает синтетическое уведомление.
- После первого реального нарушения подтвердите, что инцидент появляется под Incidents и его измеренное значение соответствует соответствующему запросу панели.
Устранение неполадок
| Симптом | Вероятная причина |
|---|---|
| Alert никогда не срабатывает | enabled = false, или нет прикрепленных каналов, или основной запрос CH возвращает 0 строк. Используйте test для подтверждения каналов; используйте /queries/run для подтверждения метрики. |
| Уведомление Slack отсутствует | alerts.slack_default_webhook (или ключ переопределения для каждого alert) не установлен: проверьте alert_notifications.target на строках <unset:…>; или тип slack глобально отключен в alerts.enabled_channels: проверьте строки alert_notifications со статусом skipped_disabled и целевым <channel_disabled>. |
| Generic webhook 401 | Получатель требует подписи, но alerts.webhook_signing_secret не установлен. Проверьте на получателе, что HMAC соответствует hmac_sha256(secret, body). |
| Email “from all sends failed” | SMTP-учетные данные неправильны или адрес from отклоняется вашим реле. Та же поверхность, которая доставляет email-ы OTP: если те работают, SMTP-транспорт в порядке. |
| Инцидент переоткрывается повторно | Составные параметры слишком агрессивны: попробуйте увеличить min_breaches или eval_window, чтобы временные всплески не переоткрывали разрешенные инциденты. |

