Durchläufe und Ergebnisse
Einen Durchlauf starten
Drücken Sie Experiment ausführen in der Werkzeugleiste des Editors. Bevor etwas gesendet wird:
- Das Experiment wird geprüft, wie der Editor es prüft — sein Graph, Felder, Namen und Werte (was geprüft wird) —, und jedes Geheimnis, das es verwendet, muss gespeichert sein (Geheimnisse).
- Es wird gespeichert.
- Der Durchlauf öffnet, was er für seine ganze Länge braucht: seine Emulatoren, seine Störungs-Relais, die Sockets, auf denen seine Warteknoten lauschen, und seine MQTT-Abonnements.
Schlägt etwas davon fehl, läuft nichts: Das Problem wird gezeigt, und der Knoten, um den es geht, wird ausgewählt. Andernfalls öffnet sich die Zeitleiste unter der Arbeitsfläche, und die Schritte erscheinen darin, wie sie geschehen. Während der Durchlauf läuft, wird Experiment ausführen zu Stoppen, und das Experiment lässt sich nicht bearbeiten.
Der Durchlauf verwendet die Werte des aktiven Profils und den im Experiment fixierten Startwert oder einen neuen. Um einmal mit anderen auszuführen, verwenden Sie Ausführen mit….
Mit anderen Werten ausführen
Das ▾ neben Experiment ausführen öffnet Ausführen mit…: andere Werte für einen Durchlauf, ohne das Experiment zu ändern.
| Feld | Was | Leer |
|---|---|---|
| Profil | das Profil für diesen Durchlauf; angezeigt, wenn das Experiment Profile hat | das aktive |
| jeder Parameter | ein Wert nur für diesen Durchlauf | der Wert des gewählten Profils, grau angezeigt |
| Startwert | der Startwert für diesen Durchlauf, 0–9 007 199 254 740 991; die Schaltfläche daneben füllt den Startwert des letzten Durchlaufs ein | der fixierte Startwert oder ein neuer |
Experiment ausführen im Formular startet den Durchlauf; Zurücksetzen leert das Formular. Was Sie getippt haben, bleibt für die Sitzung im Formular, sodass dieselbe Änderung beim nächsten Mal ein Klick ist. Ein Profil, das nicht laufen würde, ist mit ⚠ markiert. Die Priorität der Werte steht in Daten.
Hat das Experiment Profile oder wurden für einen Durchlauf Werte getippt, sagt die Zeitleiste, welches Profil der Durchlauf verwendet hat — oder Standardwerte —, und, wenn Werte getippt wurden, geänderte Werte.
Die Zeitleiste
Durchlauf-Zeitleiste liegt unter der Arbeitsfläche; ▸ und ▾ falten sie, ihr Rand ändert ihre Größe. Sie enthält eine Zeile pro Schrittereignis, die älteste zuerst: die Zeit, der Knoten, sein Zustand und was geschah — HTTP 200 · 41 ms, token = abc123, /pong 42 ← 127.0.0.1:9000 · 12 ms. Ein Fehler sagt, warum, sein technisches Detail im Tooltip. Ein Klick auf eine Zeile wählt ihren Knoten auf der Arbeitsfläche aus.
| Zustand | Der Schritt |
|---|---|
| Läuft | hat begonnen |
| Bestanden | endete gut und wählte seinen Ausgang |
| Fehlgeschlagen | schlug fehl; der erste Fehler ist der des Durchlaufs |
| Neuer Versuch | schlug einen Versuch lang fehl und versucht es erneut (Neuversuch) |
| Wiederholt | sendet immer wieder, höchstens eine Zeile pro Sekunde (Wiederholung) |
| Unter Last | ist unter Last, eine Zeile pro Sekunde (Last) |
Auf der Arbeitsfläche trägt jeder Knoten eine Plakette mit seinem neuesten Zustand.
Der Kopf der Zeitleiste enthält:
- das Ergebnis: Läuft, Bestanden, Fehlgeschlagen mit dem Grund oder Gestoppt;
- Bericht gespeichert, sobald der Bericht geschrieben ist — in einem Browser ein Link, der ihn herunterlädt, in der Desktop-App sein Pfad im Tooltip;
- Vergleichen, um diesen Durchlauf neben einen früheren zu stellen (Durchläufe vergleichen);
- das Profil und geänderte Werte, wie oben;
- den Startwert des Durchlaufs mit Fixieren oder, wenn das Experiment einen fixiert hat, jenen Startwert mit Lösen (Startwerte).
Frames. Während der Inspektor aufzeichnet, behält ein Warteknoten — oder ein Senden, das auf seine Antwort wartet —, der eine Nachricht abgeglichen hat, die Nummer des Frames jener Nachricht. Eine Schaltfläche unter den Zeilen nennt den Knoten und den Frame; sie öffnet den Inspektor im unteren Bereich mit ausgewähltem Frame. Siehe den Inspektor.
Die Zeitleiste zeigt den letzten Durchlauf des Experiments in dieser Sitzung; sie wird geleert, wenn ein anderes Experiment geöffnet wird.
Stopp
Drücken Sie Stoppen oder Alle stoppen in der Kopfzeile, um alle Jobs auf einmal zu stoppen. Der Durchlauf endet sofort (was stoppt), die Zeitleiste zeigt Gestoppt, und kein Bericht wird gespeichert. Ein Durchlauf, der von der Kommandozeile oder der API auf einem Server gestartet wurde, ist ein Job wie jeder andere: Alle stoppen auf jenem Server stoppt ihn ebenfalls, und sein Aufrufer erfährt, dass er gestoppt wurde.
Das Ergebnis
| Ergebnis | Bedeutet | Bericht |
|---|---|---|
| Bestanden | jeder Zweig endete, kein Schritt schlug fehl und das Ende wurde erreicht | gespeichert |
| Fehlgeschlagen | ein Schritt schlug fehl — eine Prüfung, ein Warteknoten ohne Timeout-Verbindung, ein Netzwerkfehler, ein Schwellenwert —, oder dem Durchlauf ging die Zeit aus (run.timeout), ein Join wartete vergeblich (run.join_waiting), oder kein Zweig erreichte das Ende (run.no_end) | gespeichert, mit dem ersten Fehler |
| Gestoppt | jemand stoppte ihn | keiner |
| startete nicht | das Experiment ist ungültig, ein Geheimnis fehlt oder ein Port ließ sich nicht öffnen | keiner |
Ein fehlgeschlagener Durchlauf nennt den Knoten und das Feld seines ersten Fehlers; die Fehlerreferenz listet jeden Code auf. Die Kommandozeile sagt dasselbe mit ihrem Exit-Code: 0 bestanden, 1 fehlgeschlagen, 2 das Experiment oder der Aufruf war ungültig (ein fehlendes Geheimnis zählt), 3 etwas außerhalb des Experiments hielt es vom Laufen ab, etwa ein Port, der sich nicht öffnen ließ. Siehe signallab run.
Der Bericht des Durchlaufs
Jeder Durchlauf, der von selbst endet — bestanden oder fehlgeschlagen —, schreibt einen JSON-Bericht in den Ordner runs des Datenordners: Documents/SignalLab/runs auf einem Desktop, der eigene Datenordner des Servers auf einem Server (Dateien). Die Datei ist run-<start time in ms>-<job number>.json; ein Bericht wird nie über einen anderen geschrieben. Lässt sie sich nicht schreiben, sagt der Editor, warum.
| Schlüssel | Was |
|---|---|
version | das Format des Berichts, jetzt 5 |
experiment | der Name des Experiments |
document_version | die Version des Experiments, jetzt 9 |
seed | der Startwert, den der Durchlauf verwendete |
profile | das Profil, mit dem er lief, oder null für die Standardwerte |
overrides | die in Ausführen mit… getippten Werte |
params | jeder Parameterwert, den der Durchlauf verwendete |
started_ms, ended_ms | Unix-Millisekunden |
outcome | passed oder failed |
error | der erste Fehler oder null |
steps | jedes Schrittereignis, in Reihenfolge (unten) |
emulators | die Zahlen jedes Emulator-Knotens — vorhanden, wenn es einen gibt (Emulatoren) |
impairments | die Zahlen und Phasen jedes Störungs-Knotens — vorhanden, wenn es einen gibt (Phasen) |
Jedes Schrittereignis hat:
| Schlüssel | Was |
|---|---|
job_id, node_id | der Durchlauf und der Knoten |
ts | Unix-Millisekunden |
state | running, passed, failed, retry, repeating, load |
detail | was geschah, auf Englisch |
message_key, message_params | dasselbe wie der Text der Oberfläche und seine Werte, sodass der Schritt in jeder Sprache gezeigt werden kann |
vars | die Variablen, die der Schritt schrieb, falls welche |
error | warum er fehlschlug: code, params, node, field, detail |
frame | der Inspector-Frame, den ein Warteknoten abglich, wenn der Mitschnitt an war |
load | was eine Last maß (Messwerte), bei ihrem letzten Ereignis |
Geheimniswerte erscheinen nie in einem Bericht: Sie werden als •••• maskiert (Maskierung).
Das Format des Berichts wuchs mit den Funktionen: Version 3 fügte die Zahlen der Emulatoren hinzu, Version 4 die Phasen der Störungen, Version 5 die Messungen einer Last.
Die Berichte sind die Durchlauf-Historie: Vergleichen liest sie, und ebenso experiment_runs. Das --report der Kommandozeile kopiert den Bericht eines Durchlaufs dorthin, wo Sie ihn wollen.
Startwerte
Jeder Durchlauf hat einen Startwert, eine ganze Zahl von 0 bis 9 007 199 254 740 991. Er ist, in dieser Reihenfolge:
- der Startwert, der diesem Durchlauf in Ausführen mit…, auf der Kommandozeile (
--seed) oder an die API gegeben wurde; - der im Experiment fixierte Startwert;
- ein neuer zufälliger Startwert.
Die erste Zeile des Durchlaufs in der Zeitleiste gibt ihn, und der Bericht behält ihn.
Der Startwert entscheidet alles Zufällige, was ein Durchlauf tut: die Generatoren in Vorlagen, den Jitter der Wiederholung, die Ankünfte einer zufälligen Last, das Schicksal jedes Pakets in einem Störungs-Relais und die Zufallsentscheidungen eines Emulators. Jeder zieht aus einem eigenen Strom, sodass parallele Zweige nie die Werte des jeweils anderen verschieben.
Um einen Durchlauf zu wiederholen:
- Drücken Sie Fixieren neben seinem Startwert in der Zeitleiste. Der Startwert wird im Experiment gespeichert, und jeder Durchlauf verwendet ihn, bis Sie Lösen drücken. Unter Parameter zeigt und bearbeitet Startwert den fixierten Startwert; leer ist er pro Durchlauf neu.
- Führen Sie mit demselben Profil und denselben Werten aus; der Bericht listet sie auf.
Was ein Startwert nicht wiederholen kann: die Zeit ({{now}}), {{run.id}} und wann Geräte und das Netzwerk antworten.
Einen einzelnen Knoten ausprobieren
Um einen Knoten auszuprobieren, ohne das Experiment auszuführen, wählen Sie ihn aus und drücken Sie Jetzt senden — oder Ctrl+Enter in seinen Eigenschaften — an einem Knoten HTTP-Anfrage, TCP-Nachricht, OSC-Nachricht, UDP-Datagramm, MQTT veröffentlichen, WebSocket verbinden oder WebSocket senden. Bei einem Warteknoten ist es Jetzt empfangen: Er lauscht von jetzt an, bis eine Nachricht passt oder seine Zeitüberschreitung endet.
Die Engine führt den Knoten mit dem Code aus, den ein Durchlauf verwendet, einmal:
- mit den Werten des aktiven Profils, den in dieser Sitzung bekannten Variablenwerten (aus dem letzten Durchlauf und früheren Versuchen) und den gespeicherten Geheimnissen;
- mit dem fixierten Startwert oder einem neuen;
{{run.id}}ist0und{{counter}}ist1; - ohne Neuversuch, Wiederholung oder Last — eine Sendung;
- ohne Cookies: eine Anfrage, nichts davor gesetzt, um zurückgesendet zu werden;
- ohne die Relais und Emulatoren des Durchlaufs. Ein Auf HTTP-Anfrage warten lauscht auf einem eigenen Empfänger, und ein WebSocket-Senden oder -Warten öffnet die Verbindung, die sein WebSocket verbinden beschreibt, für diesen einen Versuch.
Hat ein Name, den der Knoten verwendet, noch keinen Wert, wird nichts gesendet, und das Ergebnis sagt, welche Namen fehlen — führen Sie das Experiment aus oder verwenden Sie zuerst Jetzt senden an dem Knoten, der sie setzt.
Das Ergebnis zeigt ✓ oder ✕ und was geschah. Bei einer HTTP-Anfrage zeigt es außerdem den Status, die Zeit, die Größe und die Antwort; in einer JSON-Antwort lässt sich jeder Wert anklicken, um ihn zu extrahieren, und Nachbilden macht die Antwort zu einer Route eines Emulators. Die Werte, die ein Warteknoten empfangen hat oder die die Wert extrahieren-Knoten direkt nach einer Anfrage aus ihrer Antwort nehmen würden, werden der Vorschau und dem nächsten Jetzt senden bekannt. Während ein Durchlauf läuft, ist Jetzt senden nicht verfügbar.
Die Vorschau eines Knotens mit Vorlagen — was er senden wird — wird ebenfalls von der Engine aufgelöst, ohne etwas zu senden.
Experimentdateien
Das arbeitende Experiment
Der Editor hält ein Experiment, 0,7 s nach jeder Änderung von selbst in experiment.json im Datenordner gespeichert; die Werkzeugleiste zeigt Wird gespeichert…, Gespeichert oder Speichern fehlgeschlagen. Ein unfertiger Graph speichert ebenfalls. Eine Datei, die sich nicht lesen lässt, wird mit ihrem Pfad gemeldet, nie ersetzt. Eine Experimentdatei ist höchstens 4 MiB groß.
Auf einem Server liegt die Datei im Datenordner des Servers, sodass jeder Browser, der den Editor dort öffnet, am selben Experiment arbeitet.
Öffnen, Vorlagen und Export
Die Schaltfläche ☰ in der Werkzeugleiste öffnet Experimente:
- Vorlagen: Leeres Experiment, HTTP-Prüfung, HTTP zu OSC, Parallele Abläufe, OSC-Ping → Antwort, Abfragen bis bereit, Unzuverlässige API erneut abfragen, Störungsphasen, Ausfall einer Abhängigkeit, WebSocket-Echo. Ihre Ziele liegen auf
127.0.0.1. - JSON öffnen… liest eine Datei von bis zu 4 MiB — dieses Formats des Experiments oder eines älteren, das beim Öffnen auf den neuesten Stand gebracht wird — und prüft sie, bevor sie ihren Namen und die Zahl ihrer Knoten und Verbindungen zeigt. Die Datei muss auch in der Form, in der der Editor sie schreibt, eingerückt, in 4 MiB passen, sodass eine kompakte Datei nahe der Grenze abgelehnt werden kann. Eine beschädigte Datei wird mit Zeile und Spalte des Problems abgelehnt, eine Datei von einem neueren Signal Lab mit
doc.version_unsupported, und das aktuelle Experiment bleibt. - Experiment öffnen ersetzt das aktuelle Experiment durch das gewählte. Ctrl+Z holt das vorherige während dieser Sitzung zurück. Das Öffnen eines Experiments führt es nicht aus.
- Aktuelles JSON exportieren schreibt eine Kopie in den Ordner
exportsdes Datenordners, alsexperiment-<time in ms>-<random>.json, nie über eine andere Kopie; in einem Browser holt Herunterladen sie.
Die Kommandozeile und die API nehmen dieselben Dateien und die Vorlagen nach Namen: empty, http-check, status-branch, parallel-flows, osc-ping-reply, poll-until-ready, flaky-api, fault-phases, dependency-outage, websocket-echo.
Dokumentversionen
Eine Experimentdatei hat eine version; dieses Signal Lab schreibt Version 9 und öffnet jede frühere, wobei es ergänzt, was die ältere Datei nicht halten konnte. Eine Datei einer neueren Version als 9 wird abgelehnt (doc.version_unsupported), statt ohne das, was sie hält, geöffnet zu werden.
| Version | Hinzugefügt |
|---|---|
| 2 | Parameter und der Startwert |
| 3 | Profile |
| 4 | Neuversuch und eine von einem OSC- oder UDP-Senden erwartete Antwort |
| 5 | Wiederholung und Schleife |
| 6 | Emulator und Auf HTTP-Anfrage warten |
| 7 | Störung, Störung ändern und Emulator aus/an |
| 8 | die WebSocket-Knoten, HTTP-Authentifizierung und der Cookie-Speicher |
| 9 | Last auf einer HTTP-Anfrage und Störung über TCP |
Eine Datei von vor Version 8 öffnet mit ausgeschaltetem Cookies zwischen Anfragen behalten, sodass sie läuft wie zuvor; eine neuere Datei behält ihre eigene Einstellung. Erneut gespeichert, wird jede Datei zu Version 9.
Von der Kommandozeile oder einem Server
Ein Durchlauf ist überall gleich: Die Kommandozeile und die API des Servers starten denselben Durchlauf wie der Editor, mit denselben Schritten, demselben Ergebnis und Bericht.
signallab run checkout.json --profile Stage -p api=http://192.0.2.10:8080 --seed 42 --report report.jsonsignallab runführt Experimentdateien oder Vorlagen in diesem Prozess oder auf einem Server aus, gibt die Schritte wie die Zeitleiste aus und beendet sich mit dem Code des Ergebnisses.POST /api/runführt einen auf einem Server aus und antwortet mit dem Ergebnis oder streamt seine Schritte, wie sie geschehen. Ein Client, der weggeht, stoppt den Durchlauf nicht; er läuft bis zu seinem Ende und behält seinen Bericht.- In CI: GitHub Actions und andere.