Перейти к содержимому

Workflow-мониторы (multi-step API)

Обычный HTTP-монитор дёргает один URL. Но реальная проверка живости API часто требует последовательности: сначала залогиниться, получить токен, потом дёрнуть защищённый endpoint с этим токеном. Workflow-монитор выполняет именно такую цепочку — до 20 HTTP-шагов подряд, передавая значения из ответа одного шага в запросы следующих.

Шаги выполняются строго по порядку. Если любой шаг не прошёл (timeout, неверный HTTP-статус, тело не содержит ожидаемого, JSONPath-assert не совпал или extractor не нашёл значение) — цепочка останавливается, монитор переходит в статус down и приходит alert с указанием упавшего шага.

Каждый шаг (WorkflowStep) — это один HTTP-запрос со своими проверками и извлекаемыми переменными:

ПолеТипНазначение
namestringчеловеко-читаемое имя шага (попадёт в alert) — обязательно
methodstringGET / POST / PUT / PATCH / DELETE / HEADобязательно
urlstringURL запроса; поддерживает {{var}}обязательно
headersstringJSON-объект {"Header":"Value"}; значения поддерживают {{var}}
bodystringтело запроса; поддерживает {{var}}
expectedStatusint0 = любой 2xx; иначе точный статус в [100, 599]
bodyContainsstringподстрока, которая должна присутствовать в теле ответа
assertJsonPathstringJSONPath для проверки значения в теле (см. ниже)
assertValuestringожидаемое значение для assertJsonPath (обязательно, если задан assertJsonPath)
extractorsarrayсписок переменных, извлекаемых из ответа этого шага

Сами шаги хранятся в поле steps монитора как JSON-массив, сериализованный в строку.

Каждый extractor — это пара {name, jsonPath}:

  • name — имя переменной, под которым результат станет доступен в следующих шагах;
  • jsonPath — путь к значению в JSON-ответе.

Извлечённое значение подставляется в url, headers и body последующих шагов по синтаксису {{name}}. Неизвестные плейсхолдеры остаются как есть.

JSONPath — простой: $.token, $.user.id, индексы массива через точку — $.items.0.id. Корень $ опционален.

[
{
"name": "Login",
"method": "POST",
"url": "https://api.example.com/auth/login",
"headers": "{\"Content-Type\":\"application/json\"}",
"body": "{\"email\":\"bot@example.com\",\"password\":\"s3cret\"}",
"expectedStatus": 200,
"extractors": [
{"name": "token", "jsonPath": "$.access_token"},
{"name": "userId", "jsonPath": "$.user.id"}
]
},
{
"name": "Профиль пользователя",
"method": "GET",
"url": "https://api.example.com/users/{{userId}}",
"headers": "{\"Authorization\":\"Bearer {{token}}\"}",
"expectedStatus": 200,
"assertJsonPath": "$.status",
"assertValue": "active"
}
]

Первый шаг логинится и извлекает token и userId. Второй подставляет оба в URL и заголовок Authorization, ждёт 200 и проверяет, что $.status == "active".

ПолеПо умолчаниюОграничения
appidприложение, в которое уйдёт alert — обязательно
nameназвание монитора, 1..200 символов — обязательно
stepsJSON-массив шагов: 1..20 штук — обязательно
intervalSecкак часто проверять, 60..86400 сек — обязательно
timeoutSec15timeout на один шаг, максимум 60 сек
alertMessageтекст уведомления, 1..2000 символов — обязательно
alertTitleпустозаголовок уведомления
alertMessageMarkdownfalseтрактовать alertMessage как Markdown
alertPriority0приоритет уведомления, 0..10
notifyOnChangefalseслать уведомление, когда любое извлечённое значение изменилось с прошлого успешного прогона

При notifyOnChange: true монитор запоминает последние извлечённые значения (extractors) и шлёт уведомление, когда что-то из них изменилось. Удобно следить не только за доступностью, но и за тем, что какое-то поле в ответе API «поехало» (например, версия билда, цена, остаток на складе).

Чтобы не описывать HTTP-запрос руками, есть POST /workflow-monitor/build-step: вы пишете, что должен делать шаг, на естественном языке — LLM подбирает метод, URL, заголовки, тело, проверки и extractors, после чего кандидат реально выполняется для верификации.

Ранее подтверждённые шаги передаются в steps — они воспроизводятся, чтобы накопить переменные и дать модели пример ответа предыдущего шага (это помогает ей выбрать правильный JSONPath).

Окно терминала
curl -X POST "$NOTIFLY_URL/workflow-monitor/build-step" \
-H "X-Notifly-Key: C-xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"description": "получить профиль текущего пользователя с Bearer-токеном из прошлого шага",
"steps": [ /* уже подтверждённые шаги */ ],
"timeoutSec": 15
}'

В ответе:

ПолеНазначение
stepпредложенный WorkflowStep (метод, URL, заголовки, тело, проверки, extractors)
labelкороткое имя шага
reasonпояснение, почему модель выбрала такой запрос
verifiedtrue, если кандидат удалось выполнить успешно
statusCodeHTTP-статус ответа кандидата
sampleBodyфрагмент тела ответа
extractedVarsпеременные, реально извлечённые этим шагом
availableVarsпеременные, доступные на этом шаге (из предыдущих)
noteзаполняется, если верификация не удалась — с текстом ошибки

Перед сохранением монитора прогоните всю цепочку через POST /workflow-monitor/test:

Окно терминала
curl -X POST "$NOTIFLY_URL/workflow-monitor/test" \
-H "X-Notifly-Key: C-xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"steps": [ /* массив шагов */ ], "timeoutSec": 15}'

Ответ:

{ "ok": true, "vars": {"token": "ey...", "userId": "42"} }

При успехе ok: true и vars — итоговый набор накопленных переменных. При сбое:

{ "ok": false, "failedStep": 1, "error": "HTTP 401 (expected 200)" }

failedStep — индекс упавшего шага (с нуля), error — причина: неверный статус, отсутствие подстроки/JSONPath, несовпадение assert-значения или сетевой timeout.

POST /workflow-monitor/:id/pause останавливает проверки (следующая проверка отодвигается далеко в будущее), …/resume — ставит монитор в очередь на проверку немедленно. Косметическое редактирование (название, текст алерта) не перепланирует проверку; изменение шагов, интервала, timeout-а или notifyOnChange — перепланирует на «сейчас».

Метод и путьАвторизацияНазначение
GET /workflow-monitorclient-tokenсписок мониторов
POST /workflow-monitorclient-token (write)создать монитор
PUT /workflow-monitor/:idclient-token (write)обновить
DELETE /workflow-monitor/:idclient-token (write)удалить
POST /workflow-monitor/:id/pauseclient-token (write)приостановить проверки
POST /workflow-monitor/:id/resumeclient-token (write)возобновить проверки
POST /workflow-monitor/build-stepclient-token (write)ИИ-подбор и верификация одного шага
POST /workflow-monitor/testclient-token (write)прогнать цепочку без сохранения

Все endpoint-ы доступны и под MCP-кодом (M…): чтение — любым MCP-кодом, запись — кодом со scope write. Управлять мониторами можно и через ассистента, и из админки.