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

Запуски и результаты ​

Начало запуска ​

Нажмите Запустить на панели инструментов редактора. Прежде чем что-либо будет отправлено:

  1. Эксперимент проверяется так же, как его проверяет редактор — граф, поля, имена и значения (что проверяется), — и все используемые им секреты должны быть сохранены (секреты).
  2. Он сохраняется.
  3. Запуск открывает всё, что ему нужно на всё время работы: свои эмуляторы, свои реле помех, сокеты, на которых слушают его ожидания, и свои подписки MQTT.

Если что-то из этого не удаётся, ничего не запускается: показывается проблема, и выделяется узел, к которому она относится. Иначе под холстом открывается лента запуска, и шаги появляются в ней по мере выполнения. Пока идёт запуск, кнопка Запустить превращается в Стоп, а эксперимент нельзя редактировать.

Запуск использует значения активного профиля и seed, закреплённый в эксперименте, или новый. Чтобы один раз запустить с другими, воспользуйтесь кнопкой Запустить с….

Запуск с другими значениями ​

Стрелка ▾ рядом с кнопкой Запустить открывает форму Запустить с…: другие значения для одного запуска, без изменения эксперимента.

ПолеЧтоЕсли пусто
Профильпрофиль для этого запуска; показывается, когда в эксперименте есть профилиактивный
каждый параметрзначение только для этого запусказначение выбранного профиля, показанное серым
Seedseed для этого запуска, 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
seedseed, который использовал запуск
profileпрофиль, с которым шёл запуск, или null для значений по умолчанию
overridesзначения, введённые в Запустить с…
paramsвсе значения параметров, которые использовал запуск
started_ms, ended_msмиллисекунды Unix
outcomepassed или failed
errorпервая ошибка или null
stepsвсе события шагов по порядку (ниже)
emulatorsсчётчики каждого узла эмулятора — есть, если такой узел есть (эмуляторы)
impairmentsсчётчики и фазы каждого узла помех — есть, если такой узел есть (фазы)

У каждого события шага есть:

КлючЧто
job_id, node_idзапуск и узел
tsмиллисекунды Unix
staterunning, 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. Это, по порядку:

  1. seed, заданный для этого запуска в Запустить с…, в командной строке (--seed) или в API;
  2. seed, закреплённый в эксперименте;
  3. новый случайный seed.

Он указан в первой строке запуска в ленте, и отчёт его хранит.

Seed определяет всё случайное, что делает запуск: генераторы в шаблонах, разброс серии отправок, моменты прихода при случайной нагрузке, судьбу каждого пакета в реле помех и случайные выборы эмулятора. Каждый берёт значения из собственного потока, поэтому параллельные ветки никогда не сдвигают значения друг друга.

Чтобы повторить запуск:

  1. Нажмите Закрепить рядом с его seed в ленте запуска. Seed сохраняется в эксперименте, и каждый запуск использует его, пока вы не нажмёте Открепить. В Параметры поле Seed показывает и меняет закреплённый seed; если оно пусто, seed — новый в каждом запуске.
  2. Запустите с тем же профилем и значениями; отчёт их перечисляет.

Чего 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 сервера начинают тот же запуск, что и редактор, с теми же шагами, результатом и отчётом.

bash
signallab run checkout.json --profile Stage -p api=http://192.0.2.10:8080 --seed 42 --report report.json
  • signallab run запускает файлы экспериментов или шаблоны в этом процессе или на сервере, печатает шаги так же, как лента запуска, и завершается кодом результата.
  • POST /api/run запускает эксперимент на сервере и отвечает результатом либо передаёт его шаги потоком по мере выполнения. Клиент, который ушёл, запуск не останавливает: тот доходит до конца и сохраняет свой отчёт.
  • В CI: GitHub Actions и другие.