Zum Inhalt springen

Ereignisse ​

Alles, was geschieht, während ein Job läuft — die Schritte eines Durchlaufs, die Nachrichten eines Monitors, die Zahlen eines Bursts, die Frames des Inspektors, das Ende eines Jobs —, wird als Ereignis gesendet. In einem Browser erhält die Seite des Servers sie auf einem WebSocket, /api/events; ein Skript kann auf demselben Socket lauschen. Die Desktop-App erhält dieselben Ereignisse, mit denselben Namen und Nutzdaten, innerhalb der App.

Abonnieren ​

Öffnen Sie einen WebSocket zu /api/events auf dem Server:

bash
websocat -H "Authorization: Bearer $TOKEN" ws://127.0.0.1:1430/api/events
  • Authentifizierung ist die des übrigen API: das Token als Authorization: Bearer oder das Sitzungs-Cookie eines Browsers. Ohne sie wird das Upgrade mit 401 auth.required abgelehnt.
  • Origin: Ein Client, der einen Origin-Header sendet, muss den eigenen des Servers senden (Host und Port gleich Host), sonst wird das Upgrade mit 403auth.origin abgelehnt. Die meisten WebSocket-Bibliotheken außerhalb eines Browsers senden keinen.
  • Jedes Ereignis an jeden Client. Es gibt nichts zu abonnieren: Jeder Socket erhält jedes Ereignis jedes Jobs, wer ihn auch gestartet hat. Wählen Sie aus, was Sie brauchen, nach event und nach job_id in den Nutzdaten.
  • Nur lauschen. Der Server ignoriert, was ein Client sendet, außer einem Close; eine Nachricht über 64 KiB schließt den Socket.
  • Keep-alive. Der Server pingt alle 20 s, damit ein stiller Socket durch Proxys offen bleibt. Wenn der Server stoppt, schließt er jeden Socket.
  • Nichts wird wiederholt. Ereignisse, die gesendet wurden, während ein Client nicht verbunden war, sind für ihn verloren. Ein Client, der sich neu verbindet, sollte den aktuellen Zustand mit Befehlen lesen (jobs_list, inspect_snapshot, emulator_exchanges…).
  • Zurückfallen. Bis zu 4096 Ereignisse warten auf einen Socket. Ein Client, der weiter zurückfällt, erhält server://lagged mit der Zahl, die er verpasste.

Nachrichtenformat ​

Jedes Ereignis ist eine Textnachricht mit einem JSON-Objekt:

json
{ "event": "scan://open", "payload": { "job_id": 9, "ts": 1759600000123, "port": 8080, "banner": null } }
FeldWas es ist
eventDer Kanal, unten
payloadDie Werte des Ereignisses; ihre Gestalt hängt vom Kanal ab

Zeiten (ts, first_ms und last_ms einer Gegenstelle) sind Millisekunden seit 1970; Latenzen und andere Dauern (*_latency_ms, p50_ms…, ms) sind Millisekunden. Fehler in Nutzdaten sind EngineError-Objekte; ihre Codes stehen in Fehlermeldungen.

Kanäle ​

KanalGesendet vonWann
experiment://stepEin DurchlaufEin Schritt startet, besteht, schlägt fehl, versucht erneut, wiederholt oder meldet Last
experiment://endedEin DurchlaufEinmal, wenn der Durchlauf von selbst endet
job://endedJeder JobEinmal, wenn der Job von selbst endet oder fehlschlägt
osc://messageOSC-MonitorJedes Paket
osc://gen-tickOSC-GeneratorJede Nachricht oder 30- bis 45-mal pro Sekunde über 60 Nachrichten pro Sekunde
http://burst-progressHTTP-BurstAlle 100 ms und am Ende
ws://stateWebSocket-VerbindungVerbunden, geschlossen
ws://messagesWebSocket-VerbindungAlle 100 ms mit etwas Neuem
mqtt://stateMQTT-VerbindungVerbunden, abonniert, geschlossen
mqtt://messagesMQTT-VerbindungAlle 100 ms mit etwas Neuem
mqtt://ackMQTT-VerbindungEine QoS-1/2-Veröffentlichung ist abgeschlossen; ein Unsubscribe wurde beantwortet
broadcast://emit-statBeaconAlle 250 ms und am Ende
broadcast://peersDiscovery-ListenerAlle 400 ms
netsim://statStörungs-RelaisAlle 250 ms
storm://statSturmAlle 250 ms und am Ende
scan://openScannerJeder offene Port
scan://progressScannerEtwa alle 1 % des Bereichs und am Ende
emulator://activityEmulator-JobAlle 200 ms mit etwas Neuem
inspect://batchInspektorAlle 120 ms mit neuen Frames, etwa einmal pro Sekunde bei Stille, solange der Mitschnitt läuft
server://laggedDer ServerEin Client fiel zurück

experiment://step ​

Ein Schritt eines Durchlaufs: ein Knoten, der startet, besteht, fehlschlägt, auf einen neuen Versuch wartet, sich wiederholt oder den Fortschritt einer Last meldet. Ein mit /api/run gestarteter Durchlauf sendet dieselben Schritte in seiner Antwort (siehe Durchläufe).

FeldTypBedeutung
job_idnumberDer Job des Durchlaufs
tsnumberWann
node_idstringDer Knoten
statestringrunning, passed, failed, retry (ein Versuch schlug fehl und der Schritt läuft nach einer Pause erneut), repeating (der Fortschritt einer wiederholten Aktion, höchstens einmal pro Sekunde) oder load (der Fortschritt einer Last, höchstens einmal pro Sekunde)
detailstringWas geschah, auf Englisch; leer bei running und failed (siehe error)
message_keystring or nullDer Text der Oberfläche dafür, als Schlüssel ihres Wörterbuchs
message_paramsobject or nullDie Werte, die message_key nennt
varsobjectVariablen, die der Schritt schrieb; weggelassen, wenn keine
errorEngineErrorWarum er fehlschlug oder warum der Versuch fehlschlug (retry); sonst weggelassen
framenumberDer Inspektor-Frame der Nachricht, die ein Warten (oder die erwartete Antwort eines Sendens) traf, als der Mitschnitt lief; sonst weggelassen
loadobjectWas eine Last gemessen hat, ihre Schwellenwerte gelesen — beim letzten Ereignis eines Lastschritts, bestanden oder fehlgeschlagen; sonst weggelassen. Siehe Last

Ein Knoten Ende eines Durchlaufs zeigt running, wenn der erste Zweig ihn erreicht, und passed, sobald jeder Zweig ohne Fehler fertig ist. Geheime Werte sind in jedem Feld maskiert.

experiment://ended ​

Ein Durchlauf endete von selbst: Er bestand, schlug fehl oder lief aus der Zeit. Wird direkt nach denselben Nutzdaten auf job://ended gesendet. Ein mit job_stop oder Alle stoppen gestoppter Durchlauf sendet keines von beiden und speichert keinen Bericht.

FeldTypBedeutung
job_idnumberDer Job des Durchlaufs
kindstringexperiment
seednumberDer Startwert, mit dem er lief
profilestring or nullSein Profil
overriddenbooleanEinige Parameterwerte kamen von Ausführen mit… oder overrides
errorEngineError or nullDer erste Fehler des Durchlaufs; null, wenn er bestand
report_pathstring or nullSein Bericht, in runs/ des Datenordners
report_errorEngineError or nullWarum der Bericht nicht geschrieben werden konnte

job://ended ​

Ein Job endete von selbst oder schlug fehl. Ein mit job_stop oder jobs_stop_all gestoppter Job sendet es nicht.

FeldTypBedeutung
job_idnumberDer Job
kindstringosc-monitor, osc-gen, http-burst, netsim, storm, scan, beacon, discovery, mqtt, websocket, emulator oder experiment
errorEngineError or nullWarum er endete, wenn etwas schiefging

Ein job://ended eines Durchlaufs trägt auch die Felder von experiment://ended. Was jede Art beendet:

kindEndet, wennerror
osc-monitorDer Socket nicht mehr empfangen kannwait.receive_failed
osc-genSeine Dauer vorbei ist oder ein Senden fehlschlägtnull oder transport.*
http-burstSeine Gesamtzahl oder Dauer erreicht istnull
stormSeine Dauer vorbei istnull
scanJeder Port des Bereichs versucht wurdenull
beaconSeine Runden oder seine Dauer vorbei sind oder mehr als 32 Sendungen fehlschlugen, ohne dass eine gesendet wurdenull oder transport.*
discoveryDer Socket nicht mehr empfangen kannwait.receive_failed
mqttDer Broker die Verbindung schloss oder sie verlorengingtransport.* (transport.reset, wenn der Broker sie schloss) oder mqtt.protocol
websocketDie Verbindung sich schlossnull oder warum sie verlorenging
netsimDas Relais nicht mehr arbeiten kannwarum
emulatorSein Socket fehlschlägtwarum
experimentDer Durchlauf endetder Fehler des Durchlaufs oder null

osc://message ​

Ein von einem OSC-Monitor empfangenes, dekodiertes UDP-Paket. Wird für jedes Paket gesendet, ohne Bündelung.

FeldTypBedeutung
job_idnumberDer Job des Monitors
tsnumberWann es eintraf
fromstringDer Absender, IP:port
bytesnumberDie Größe des Pakets
messagesobject[]Jede Nachricht des Pakets (ein Bundle hat mehrere): address und args (OscArg[])
errorEngineError or nullosc.packet_malformed, wenn das Paket nicht dekodierte (dann ist messages leer)

osc://gen-tick ​

Der Fortschritt eines OSC-Generators: für jede Nachricht unter 60 Nachrichten pro Sekunde; darüber für jede n-te, wobei n die Rate geteilt durch 30 und abgerundet ist — 30 bis 45 Mal pro Sekunde.

FeldTypBedeutung
job_idnumberDer Job des Generators
tsnumberWann
valuenumberDer gerade gesendete Wert, bevor er auf eine Ganzzahl oder einen 32-Bit-Float gerundet wird
sentnumberBisher gesendete Nachrichten

http://burst-progress ​

Die Zahlen eines HTTP-Bursts, alle 100 ms, während er läuft, und einmal mehr mit done: true, wenn er von selbst endet.

FeldTypBedeutung
job_idnumberDer Job des Bursts
tsnumberWann
sentnumberBisher beantwortete oder fehlgeschlagene Anfragen
oknumberDavon mit einem 2xx-Status beantwortet
failednumberDavon jeder andere Status oder keine Antwort
missednumberAnfragen eines getakteten Bursts, die zu lange auf einen freien Worker warteten und übersprungen wurden
rpsnumberAnfragen pro Sekunde über die letzten 100 ms; im letzten Ereignis über den ganzen Burst
last_latency_ms, min_latency_ms, max_latency_ms, avg_latency_msnumberBisherige Latenzen
p50_ms, p90_ms, p95_ms, p99_msnumberPerzentile jeder bisherigen Anfrage, Fehler eingeschlossen, innerhalb von 0,5 %
donebooleanDas letzte Ereignis des Bursts

ws://state ​

Eine von ws_connect geöffnete WebSocket-Verbindung hat sich verbunden oder geschlossen. Eine Verbindung, deren Job gestoppt wurde, sendet kein closed.

FeldTypBedeutung
job_idnumberDer Job der Verbindung
tsnumberWann
statestringconnected oder closed
handshakeobjecturl, peer, local, protocol (das Subprotokoll, das der Server wählte, oder null) und ms (das Verbinden und das Upgrade)
closedobject or nullBei closed: code, reason, by (client, server oder lost) und error

ws://messages ​

Was eine WebSocket-Verbindung seit dem letzten Ereignis gesendet und empfangen hat, alle 100 ms, wenn es etwas gibt.

FeldTypBedeutung
job_idnumberDer Job der Verbindung
tsnumberWann
messagesobject[]In Reihenfolge: ts, dir (rx empfangen, tx gesendet), kind (text oder binary), text (die ersten 64 KiB als UTF-8, bei einer Binärnachricht ebenso; Bytes, die das nicht sind, werden �), hex (die ersten 4096 Bytes einer Binärnachricht als Hex, sonst null), bytes (die volle Größe) und truncated (mehr, als gezeigt wurde: über 64 KiB Text, über 4096 Bytes Binär)
droppednumberNachrichten, die aus diesem Ereignis weggelassen wurden, weil es mehr als 2000 waren; die ältesten zuerst

mqtt://state ​

Der Zustand einer MQTT-Verbindung hat sich geändert.

FeldTypBedeutung
job_idnumberDer Job der Verbindung
tsnumberWann
statestringconnected; subscribed nach jeder Antwort auf ein Abonnement; closed, wenn die Verbindung endete (nicht, wenn ihr Job gestoppt wurde)
brokerstringhost:port
errorEngineError or nullWarum eine closed-Verbindung endete (transport.reset, wenn der Broker sie schloss); sonst null
grantsobject[]Bei subscribed: jeder angeforderte Filter mit filter, qos (gewährt) und accepted; sonst leer

mqtt://messages ​

Was eine MQTT-Verbindung seit dem letzten Ereignis empfangen hat, alle 100 ms, wenn es etwas gibt. Eine erneut zugestellte QoS-2-Nachricht wird einmal gezeigt.

FeldTypBedeutung
job_idnumberDer Job der Verbindung
tsnumberWann
messagesobject[]ts, topic, payload (als UTF-8; Bytes, die das nicht sind, werden �), bytes, qos, retain, dup
droppednumberNachrichten, die weggelassen wurden, weil mehr als 4000 in 100 ms eintrafen; die ältesten zuerst

mqtt://ack ​

Der Broker hat etwas abgeschlossen, das die Verbindung angefordert hatte.

FeldTypBedeutung
job_idnumberDer Job der Verbindung
tsnumberWann
kindstringpublished (eine QoS-1- oder -2-Veröffentlichung ist vollständig) oder unsubscribed
packet_idnumberDie MQTT-Paket-ID
topicstring or nullDas veröffentlichte Thema; null bei unsubscribed

broadcast://emit-stat ​

Die Zähler eines Beacons, alle 250 ms, und einmal mehr, wenn er von selbst mit pps 0 endet.

FeldTypBedeutung
job_idnumberDer Job des Beacons
tsnumberWann
targetsnumberZiele in jeder Runde
roundsnumberGesendete Runden
packets, bytesnumberGesendete Datagramme und Bytes
errorsnumberFehlgeschlagene Sendungen
ppsnumberDatagramme pro Sekunde über die letzten 250 ms

broadcast://peers ​

Was ein Discovery-Listener gehört hat, alle 400 ms.

FeldTypBedeutung
job_idnumberDer Job des Listeners
tsnumberWann
peersobject[]Zuletzt Gehörtes zuerst: addr, proto, packets, bytes, first_ms, last_ms, last_summary, responded (seine Pakete, die beantwortet wurden, gezählt beim Eintreffen); höchstens 512
packets, bytesnumberAlles Empfangene
responsesnumberGesendete Antworten

netsim://stat ​

Die Zähler eines Störungs-Relais, alle 250 ms. Relais der Knoten Störung eines Durchlaufs melden stattdessen im Bericht des Durchlaufs.

FeldTypBedeutung
job_idnumberDer Job des Relais
tsnumberWann
received, forwardednumberDatagramme oder Blöcke hinein und hinaus
droppednumberVerloren durch loss, Bursts oder offline (UDP; ein TCP-Relais hält einen Datenstrom, während es offline ist, und verwirft nichts)
throttlednumberUDP: durch die Bandbreitengrenze verworfen oder weil zu viele schon unterwegs waren. TCP: Blöcke, die ihren Datenstrom wegen der Bandbreitengrenze zurückhielten
duplicated, corrupted, reorderednumberWas das Profil mit ihnen tat
bytesnumberWeitergegebene Bytes
connections, reset, stallednumberTCP: angenommene, zurückgesetzte, halboffen gelassene Verbindungen; weggelassen, solange 0
profilestringDas Profil, mit dem es jetzt stört, wie die Zeitleiste es nennt: sein Name oder was es tut (60 ms ±25 · loss 2%)

storm://stat ​

Die Zähler eines Sturms, alle 250 ms, und einmal mehr, wenn er von selbst mit pps und mbps 0 endet.

FeldTypBedeutung
job_idnumberDer Job des Sturms
tsnumberWann
packets, bytesnumberGesendete Datagramme (oder TCP-Verbindungen) und Bytes
errorsnumberFehlgeschlagene Sendungen oder Verbindungen
ppsnumberPro Sekunde über die letzten 250 ms
mbpsnumberMegabit pro Sekunde über die letzten 250 ms

scan://open ​

Der Scanner hat einen offenen Port gefunden.

FeldTypBedeutung
job_idnumberDer Job des Scans
tsnumberWann
portnumberDer Port
bannerstring or nullWas der Dienst zuerst sendete, wenn Banner angefordert wurden und er innerhalb von 400 ms etwas sagte

scan://progress ​

Wie weit ein Scan ist: etwa alle 1 % des Bereichs und wenn er von selbst mit done gleich total endet (dieses kann zweimal eintreffen).

FeldTypBedeutung
job_idnumberDer Job des Scans
tsnumberWann
donenumberVersuchte Ports
totalnumberPorts im Bereich
opennumberGefundene offene Ports

emulator://activity ​

Was ein mit emulator_start gestarteter Emulator seit dem letzten Ereignis empfangen und beantwortet hat, alle 200 ms, wenn sich etwas geändert hat (ein Austausch, das Herunter- oder Hochfahren oder eine Nachricht, die der MQTT-Broker nicht zustellen konnte). Die Knoten Emulator eines Durchlaufs senden es nicht; ihre Zähler stehen im Bericht des Durchlaufs.

FeldTypBedeutung
job_idnumberDer Job des Emulators
tsnumberWann
countsobjecttotal, unmatched, failed, down, hits (pro Regel) und missed (MQTT; weggelassen, solange 0) — wie emulator_exchanges
forcedstringunavailable, reset oder timeout, während er heruntergefahren ist; sonst weggelassen
exchangesobject[]Die neuen Austausche, wie emulator_exchanges sie auflistet, aber ohne data; höchstens 200
droppednumberAustausche nach den ersten 200 des Intervalls, die hier nicht gesendet werden; emulator_exchanges hat weiterhin die letzten 500

inspect://batch ​

Neue Inspektor-Frames. Wird nur gesendet, solange der Mitschnitt läuft: alle 120 ms, wenn es neue Frames gibt, und etwa einmal pro Sekunde, wenn es keine gibt, damit die Zähler aktuell bleiben.

FeldTypBedeutung
framesobject[]Die neuen Frames, älteste zuerst, höchstens 250; ohne ihre Bytes (verwenden Sie inspect_payload)
statsobjectDie Zähler des Mitschnitts, CaptureStats
skipped_nownumberFrames, die seit dem letzten Batch aufgezeichnet, aber nicht in diesem sind — mehr als 250 trafen ein oder der Puffer ließ sie gehen. Sie sind weiterhin in einem Export, solange der Puffer sie hält

server://lagged ​

Nur Server. Dieser Client fiel mehr als 4096 Ereignisse zurück und verpasste einige. Lesen Sie den Zustand mit Befehlen erneut.

FeldTypBedeutung
skippednumberWie viele Ereignisse er verpasste