Запуски и результаты
Начало запуска
Нажмите Запустить на панели инструментов редактора. Прежде чем что-либо будет отправлено:
- Эксперимент проверяется так же, как его проверяет редактор — граф, поля, имена и значения (что проверяется), — и все используемые им секреты должны быть сохранены (секреты).
- Он сохраняется.
- Запуск открывает всё, что ему нужно на всё время работы: свои эмуляторы, свои реле помех, сокеты, на которых слушают его ожидания, и свои подписки MQTT.
Если что-то из этого не удаётся, ничего не запускается: показывается проблема, и выделяется узел, к которому она относится. Иначе под холстом открывается лента запуска, и шаги появляются в ней по мере выполнения. Пока идёт запуск, кнопка Запустить превращается в Стоп, а эксперимент нельзя редактировать.
Запуск использует значения активного профиля и seed, закреплённый в эксперименте, или новый. Чтобы один раз запустить с другими, воспользуйтесь кнопкой Запустить с….
Запуск с другими значениями
Стрелка ▾ рядом с кнопкой Запустить открывает форму Запустить с…: другие значения для одного запуска, без изменения эксперимента.
| Поле | Что | Если пусто |
|---|---|---|
| Профиль | профиль для этого запуска; показывается, когда в эксперименте есть профили | активный |
| каждый параметр | значение только для этого запуска | значение выбранного профиля, показанное серым |
| Seed | seed для этого запуска, 0–9 007 199 254 740 991; кнопка рядом подставляет seed последнего запуска | закреплённый seed или новый |
Кнопка Запустить в форме начинает запуск; Сбросить очищает форму. Введённое остаётся в форме до конца сессии, так что то же изменение в следующий раз — один щелчок. Профиль, с которым запуск не пройдёт, помечен ⚠. Порядок приоритета значений описан на странице Данные и шаблоны.
Когда в эксперименте есть профили или для запуска вводились значения, лента запуска сообщает, какой профиль использовал запуск, — либо по умолчанию — и, если значения вводились, изменённые значения.
Лента запуска
Панель Ход запуска находится под холстом; ▸ и ▾ сворачивают и разворачивают её, а за край можно менять её размер. В ней по строке на событие шага, старые сверху: время, узел, его состояние и что произошло — HTTP 200 · 41 ms, token = abc123, /pong 42 ← 127.0.0.1:9000 · 12 ms. Ошибка сообщает причину, технические подробности — в подсказке. Щелчок по строке выделяет её узел на холсте.
| Состояние | Шаг |
|---|---|
| Выполняется | начался |
| Успешно | закончился успешно и выбрал свой выход |
| Ошибка | закончился ошибкой; первая ошибка становится ошибкой запуска |
| Повтор | попытка не удалась, будет ещё одна (повтор при ошибке) |
| Серия | отправляет снова и снова, не чаще одной строки в секунду (серия отправок) |
| Под нагрузкой | идёт под нагрузкой, одна строка в секунду (нагрузка) |
На холсте у каждого узла есть значок с его последним состоянием.
В заголовке ленты запуска:
- результат: Выполняется, Успешно, Ошибка с причиной или Остановлено;
- Отчёт сохранён, когда отчёт записан, — в браузере это ссылка для скачивания, в десктопном приложении путь указан в подсказке;
- Сравнить, чтобы поставить этот запуск рядом с более ранним (сравнение запусков);
- профиль и изменённые значения, как выше;
- seed запуска с кнопкой Закрепить или, если в эксперименте закреплён seed, этот seed с кнопкой Открепить (seed).
Кадры. Пока Инспектор ведёт захват, ожидание — или отправка, которая ждёт ответа, — получившее совпадение с сообщением, запоминает номер кадра этого сообщения. Кнопка под строками называет узел и кадр; она открывает Инспектор в нижней панели с выбранным кадром. См. Инспектор.
Лента запуска показывает последний запуск эксперимента в этой сессии; при открытии другого эксперимента она очищается.
Остановка
Нажмите Стоп или Остановить всё в шапке, чтобы остановить сразу все задачи. Запуск завершается немедленно (что останавливается), лента запуска показывает Остановлено, а отчёт не сохраняется. Запуск, начатый из командной строки или через API на сервере, — такая же задача, как любая другая: Остановить всё на этом сервере остановит и его, а тот, кто его вызвал, узнает, что запуск остановлен.
Результат
| Результат | Что означает | Отчёт |
|---|---|---|
| Успешно | все ветки завершены, ни один шаг не завершился ошибкой, и запуск дошёл до финиша | сохраняется |
| Ошибка | шаг завершился ошибкой — проверка, ожидание, у выхода Таймаут которого нет связи, сетевая ошибка, порог — или у запуска вышло время (run.timeout), слияние ждало напрасно (run.join_waiting) или ни одна ветка не дошла до финиша (run.no_end) | сохраняется, с первой ошибкой |
| Остановлено | кто-то его остановил | нет |
| не начался | эксперимент недопустим, не хватает секрета или не удалось открыть порт | нет |
Неудачный запуск называет узел и поле своей первой ошибки; все коды перечислены в справочнике ошибок. Командная строка сообщает то же кодом завершения: 0 — пройден, 1 — не пройден, 2 — эксперимент или вызов недопустимы (отсутствующий секрет тоже сюда относится), 3 — запуску помешало что-то вне эксперимента, например порт, который не удалось открыть. См. signallab run.
Отчёт о запуске
Каждый запуск, который заканчивается сам, — успешно или с ошибкой, — записывает отчёт JSON в папку runs внутри папки данных: Documents/SignalLab/runs на десктопе, собственная папка данных сервера на сервере (файлы). Файл называется run-<start time in ms>-<job number>.json; отчёт никогда не записывается поверх другого. Если записать его не удалось, редактор говорит почему.
| Ключ | Что |
|---|---|
version | формат отчёта, сейчас 5 |
experiment | название эксперимента |
document_version | версия эксперимента, сейчас 9 |
seed | seed, который использовал запуск |
profile | профиль, с которым шёл запуск, или null для значений по умолчанию |
overrides | значения, введённые в Запустить с… |
params | все значения параметров, которые использовал запуск |
started_ms, ended_ms | миллисекунды Unix |
outcome | passed или failed |
error | первая ошибка или null |
steps | все события шагов по порядку (ниже) |
emulators | счётчики каждого узла эмулятора — есть, если такой узел есть (эмуляторы) |
impairments | счётчики и фазы каждого узла помех — есть, если такой узел есть (фазы) |
У каждого события шага есть:
| Ключ | Что |
|---|---|
job_id, node_id | запуск и узел |
ts | миллисекунды Unix |
state | running, passed, failed, retry, repeating, load |
detail | что произошло, по-английски |
message_key, message_params | то же, что текст интерфейса, и его значения, чтобы шаг можно было показать на любом языке |
vars | переменные, которые записал шаг, если есть |
error | почему шаг завершился ошибкой: code, params, node, field, detail |
frame | кадр Инспектора, с которым совпало ожидание, если захват был включён |
load | что измерила нагрузка (метрики), в её последнем событии |
Значения секретов никогда не попадают в отчёт: они маскируются как •••• (маскирование).
Формат отчёта рос вместе с возможностями: версия 3 добавила счётчики эмуляторов, версия 4 — фазы помех, версия 5 — измерения нагрузки.
Отчёты — это история запусков: их читает Сравнить, а также experiment_runs. Параметр командной строки --report копирует отчёт запуска туда, куда вам нужно.
Seed
У каждого запуска есть seed — целое число от 0 до 9 007 199 254 740 991. Это, по порядку:
- seed, заданный для этого запуска в Запустить с…, в командной строке (
--seed) или в API; - seed, закреплённый в эксперименте;
- новый случайный seed.
Он указан в первой строке запуска в ленте, и отчёт его хранит.
Seed определяет всё случайное, что делает запуск: генераторы в шаблонах, разброс серии отправок, моменты прихода при случайной нагрузке, судьбу каждого пакета в реле помех и случайные выборы эмулятора. Каждый берёт значения из собственного потока, поэтому параллельные ветки никогда не сдвигают значения друг друга.
Чтобы повторить запуск:
- Нажмите Закрепить рядом с его seed в ленте запуска. Seed сохраняется в эксперименте, и каждый запуск использует его, пока вы не нажмёте Открепить. В Параметры поле Seed показывает и меняет закреплённый seed; если оно пусто, seed — новый в каждом запуске.
- Запустите с тем же профилем и значениями; отчёт их перечисляет.
Чего seed повторить не может: время ({{now}}), {{run.id}} и то, когда отвечают устройства и сеть.
Пробная отправка одного узла
Чтобы попробовать один узел, не запуская эксперимент, выберите его и нажмите Отправить сейчас — или Ctrl+Enter в его свойствах — у узла HTTP-запрос, TCP-сообщение, OSC-сообщение, UDP-датаграмма, Публикация MQTT, Подключение WebSocket или Отправка WebSocket. У узла ожидания это Слушать сейчас: он слушает с этого момента, пока не подойдёт сообщение или не истечёт его таймаут.
Движок выполняет узел тем же кодом, что и запуск, один раз:
- со значениями активного профиля, значениями переменных, известными в этой сессии (из последнего запуска и прежних проб), и сохранёнными секретами;
- с закреплённым seed или новым;
{{run.id}}равен0, а{{counter}}—1; - без повтора при ошибке, серии отправок и нагрузки — одна отправка;
- без cookie: один запрос, перед ним ничего не установлено, чтобы отправить обратно;
- без реле и эмуляторов запуска. Узел Ждать HTTP-запрос слушает на собственном слушателе, а отправка или ожидание WebSocket открывает соединение, описанное в его Подключение WebSocket, на одну эту пробу.
Если у имени, которое использует узел, пока нет значения, ничего не отправляется, а результат называет недостающие имена: сначала запустите эксперимент или нажмите Отправить сейчас у узла, который их задаёт.
Результат показывает ✓ или ✕ и что произошло. Для HTTP-запроса он показывает ещё статус, время, размер и раздел Ответ; в JSON-ответе по каждому значению можно щёлкнуть, чтобы извлечь его, а кнопка Сымитировать превращает ответ в маршрут эмулятора. Значения, полученные ожиданием, или те, что узлы Извлечь значение сразу после запроса взяли бы из его ответа, становятся известны предпросмотру и следующему Отправить сейчас. Пока идёт запуск, кнопка Отправить сейчас недоступна.
Предпросмотр узла с шаблонами — то, что он отправит, — тоже вычисляет движок, ничего не отправляя.
Файлы экспериментов
Рабочий эксперимент
Редактор держит один эксперимент, который сам сохраняется через 0,7 с после каждого изменения в experiment.json в папке данных; на панели инструментов написано Сохранение…, Сохранено или Ошибка сохранения. Незаконченный граф тоже сохраняется. Файл, который не удаётся прочитать, сообщается с путём и никогда не заменяется. Файл эксперимента — не больше 4 МиБ.
На сервере файл лежит в папке данных сервера, поэтому каждый браузер, открывающий там редактор, работает с одним и тем же экспериментом.
Открытие, шаблоны и экспорт
Кнопка ☰ на панели инструментов открывает Эксперименты:
- Шаблоны: Пустая схема, Проверка HTTP, HTTP → OSC, Параллельные потоки, OSC ping → ответ, Опрос до готовности, Повтор ненадёжного API, Фазы сбоев, Отказ зависимости, Эхо WebSocket. Их цели находятся на
127.0.0.1. - Открыть JSON… читает файл до 4 МиБ — этой версии формата эксперимента или более старой, которая при открытии обновляется, — и проверяет его, прежде чем показать название и число узлов и связей. Файл при этом должен умещаться в 4 МиБ и в том виде, в каком его записывает редактор, с отступами, поэтому компактный файл, близкий к пределу, может быть отклонён. Повреждённый файл отклоняется с указанием строки и столбца проблемы, файл из более новой версии Signal Lab — с
doc.version_unsupported, а текущий эксперимент остаётся. - Открыть схему заменяет текущий эксперимент выбранным. Ctrl+Z возвращает предыдущий в течение этой сессии. Открытие эксперимента его не запускает.
- Экспорт текущей схемы записывает копию в папку
exportsвнутри папки данных какexperiment-<time in ms>-<random>.json, никогда не поверх другой копии; в браузере её скачивает ссылка Скачать.
Командная строка и API принимают те же файлы, а шаблоны — по имени: empty, http-check, status-branch, parallel-flows, osc-ping-reply, poll-until-ready, flaky-api, fault-phases, dependency-outage, websocket-echo.
Версии документа
У файла эксперимента есть version; эта версия Signal Lab записывает версию 9 и открывает любую более раннюю, заполняя то, что старый файл не мог содержать. Файл версии новее 9 отклоняется (doc.version_unsupported), а не открывается без того, что в нём есть.
| Версия | Что добавлено |
|---|---|
| 2 | параметры и seed |
| 3 | профили |
| 4 | повтор при ошибке и ответ, который ждёт отправка OSC или UDP |
| 5 | серия отправок и Цикл |
| 6 | Эмулятор и Ждать HTTP-запрос |
| 7 | Сетевые помехи, Сменить помехи и Эмулятор: выкл./вкл. |
| 8 | узлы WebSocket, аутентификация HTTP и банка cookie |
| 9 | нагрузка на HTTP-запрос и помехи по TCP |
Файл до версии 8 открывается с выключенным флажком Хранить cookie между запросами, поэтому работает как прежде; более новый файл сохраняет собственную настройку. После повторного сохранения любой файл становится версией 9.
Из командной строки или с сервера
Запуск везде один и тот же: командная строка и API сервера начинают тот же запуск, что и редактор, с теми же шагами, результатом и отчётом.
signallab run checkout.json --profile Stage -p api=http://192.0.2.10:8080 --seed 42 --report report.jsonsignallab runзапускает файлы экспериментов или шаблоны в этом процессе или на сервере, печатает шаги так же, как лента запуска, и завершается кодом результата.POST /api/runзапускает эксперимент на сервере и отвечает результатом либо передаёт его шаги потоком по мере выполнения. Клиент, который ушёл, запуск не останавливает: тот доходит до конца и сохраняет свой отчёт.- В CI: GitHub Actions и другие.