Saltar al contenido

Eventos ​

Todo lo que ocurre mientras se ejecuta una tarea — los pasos de una ejecución, los mensajes de un monitor, las cifras de una ráfaga, las tramas del Inspector, el final de una tarea — se envía como un evento. En un navegador, la página del servidor los recibe por un solo WebSocket, /api/events; un script puede escuchar en el mismo socket. La aplicación de escritorio recibe los mismos eventos, con los mismos nombres y cargas útiles, dentro de la aplicación.

Suscribirse ​

Abre un WebSocket a /api/events en el servidor:

bash
websocat -H "Authorization: Bearer $TOKEN" ws://127.0.0.1:1430/api/events
  • Autenticación es la del resto de la API: el token como Authorization: Bearer, o la cookie de sesión de un navegador. Sin eso, el upgrade se rechaza con 401 auth.required.
  • Origin: un cliente que envía un encabezado Origin debe enviar el del propio servidor (host y puerto iguales a Host), o el upgrade se rechaza con 403auth.origin. La mayoría de las bibliotecas de WebSocket fuera de un navegador no envían ninguno.
  • Todos los eventos a todos los clientes. No hay nada a lo que suscribirse: cada socket recibe cada evento de cada tarea, la haya iniciado quien la haya iniciado. Elige lo que necesites por event, y por job_id en la carga útil.
  • Solo escuchar. El servidor ignora lo que envía un cliente, salvo un cierre; un mensaje de más de 64 KiB cierra el socket.
  • Keep-alive. El servidor hace ping cada 20 s, así que un socket silencioso sigue abierto a través de los proxys. Cuando el servidor se detiene, cierra cada socket.
  • Nada se reproduce. Los eventos enviados mientras un cliente no estaba conectado se pierden para él. Un cliente que se reconecta debe leer el estado actual con comandos (jobs_list, inspect_snapshot, emulator_exchanges…).
  • Quedarse atrás. Hasta 4096 eventos esperan a un socket. Un cliente que se queda aún más atrás recibe server://lagged con cuántos se perdió.

Formato del mensaje ​

Cada evento es un mensaje de texto que contiene un objeto JSON:

json
{ "event": "scan://open", "payload": { "job_id": 9, "ts": 1759600000123, "port": 8080, "banner": null } }
CampoQué es
eventEl canal, más abajo
payloadLos valores del evento; su forma depende del canal

Las horas (ts, el first_ms y el last_ms de un interlocutor) son milisegundos desde 1970; las latencias y otras duraciones (*_latency_ms, p50_ms…, ms) son milisegundos. Los errores de las cargas útiles son objetos EngineError; sus códigos están listados en mensajes de error.

Canales ​

CanalLo envíaCuándo
experiment://stepUna ejecuciónUn paso empieza, se supera, falla, reintenta, repite o informa de una carga
experiment://endedUna ejecuciónUna vez, cuando la ejecución termina sola
job://endedCada tareaUna vez, cuando la tarea termina sola o falla
osc://messageMonitor OSCCada paquete
osc://gen-tickGenerador OSCCada mensaje, o de 30 a 45 veces por segundo por encima de 60 mensajes por segundo
http://burst-progressRáfaga HTTPCada 100 ms, y al final
ws://stateConexión WebSocketConectada, cerrada
ws://messagesConexión WebSocketCada 100 ms con algo nuevo
mqtt://stateConexión MQTTConectada, suscrita, cerrada
mqtt://messagesConexión MQTTCada 100 ms con algo nuevo
mqtt://ackConexión MQTTSe completó una publicación QoS 1/2; se respondió a una cancelación de suscripción
broadcast://emit-statBalizaCada 250 ms, y al final
broadcast://peersEscucha de descubrimientoCada 400 ms
netsim://statRelé de degradaciónCada 250 ms
storm://statTormentaCada 250 ms, y al final
scan://openEscánerCada puerto abierto
scan://progressEscánerAproximadamente cada 1 % del rango, y al final
emulator://activityTarea de emuladorCada 200 ms con algo nuevo
inspect://batchInspectorCada 120 ms con tramas nuevas, aproximadamente una vez por segundo cuando no hay nada, mientras la captura está activada
server://laggedEl servidorUn cliente se quedó atrás

experiment://step ​

Un paso de una ejecución: un nodo que empieza, se supera, falla, espera para volver a intentarlo, repite o informa del progreso de una carga. Una ejecución iniciada con /api/run envía los mismos pasos en su respuesta (consulta ejecuciones).

CampoTipoSignificado
job_idnumberLa tarea de la ejecución
tsnumberCuándo
node_idstringEl nodo
statestringrunning, passed, failed, retry (un intento falló y el paso se ejecuta otra vez tras una pausa), repeating (el progreso de una acción que se repite, como máximo una vez por segundo) o load (el progreso de una carga, como máximo una vez por segundo)
detailstringQué ocurrió, en inglés; vacío para running y failed (consulta error)
message_keystring or nullEl texto de la interfaz para ello, como clave de su diccionario
message_paramsobject or nullLos valores que nombra message_key
varsobjectLas variables que escribió el paso; se omite cuando no hay ninguna
errorEngineErrorPor qué falló, o por qué falló el intento (retry); se omite en caso contrario
framenumberLa trama del Inspector del mensaje con el que coincidió una espera (o la respuesta esperada de un envío), cuando la captura estaba activada; se omite en caso contrario
loadobjectLo que midió una carga, leídos sus umbrales — en el último evento de un paso de carga, superado o fallido; se omite en caso contrario. Consulta carga

El nodo Fin de una ejecución muestra running cuando la primera rama lo alcanza y passed cuando cada rama ha terminado sin un fallo. Los valores secretos se enmascaran en cada campo.

experiment://ended ​

Una ejecución terminó sola: se superó, falló o se quedó sin tiempo. Se envía justo después de la misma carga útil en job://ended. Una ejecución detenida con job_stop o Detener todo no envía ninguno de los dos y no guarda ningún informe.

CampoTipoSignificado
job_idnumberLa tarea de la ejecución
kindstringexperiment
seednumberLa semilla con la que se ejecutó
profilestring or nullSu perfil
overriddenbooleanAlgunos valores de parámetros vinieron de Ejecutar con… o overrides
errorEngineError or nullEl primer fallo de la ejecución; null cuando se superó
report_pathstring or nullSu informe, en runs/ de la carpeta de datos
report_errorEngineError or nullPor qué no se pudo escribir el informe

job://ended ​

Una tarea terminó sola o falló. Una tarea detenida con job_stop o jobs_stop_all no lo envía.

CampoTipoSignificado
job_idnumberLa tarea
kindstringosc-monitor, osc-gen, http-burst, netsim, storm, scan, beacon, discovery, mqtt, websocket, emulator o experiment
errorEngineError or nullPor qué terminó, cuando algo fue mal

El job://ended de una ejecución lleva también los campos de experiment://ended. Qué termina cada tipo:

kindTermina cuandoerror
osc-monitorEl socket ya no puede recibirwait.receive_failed
osc-genSu duración terminó, o falla un envíonull, o transport.*
http-burstSe alcanza su total o su duraciónnull
stormSu duración terminónull
scanSe probó cada puerto del rangonull
beaconSus rondas o su duración terminaron, o fallaron más de 32 envíos sin ninguno enviadonull, o transport.*
discoveryEl socket ya no puede recibirwait.receive_failed
mqttEl bróker cerró la conexión o se perdiótransport.* (transport.reset cuando el bróker la cerró), o mqtt.protocol
websocketLa conexión se cerrónull, o por qué se perdió
netsimEl relé ya no puede funcionarpor qué
emulatorSu socket fallapor qué
experimentLa ejecución terminael fallo de la ejecución, o null

osc://message ​

Un paquete UDP que recibió un monitor OSC, decodificado. Se envía por cada paquete, sin agrupar.

CampoTipoSignificado
job_idnumberLa tarea del monitor
tsnumberCuándo llegó
fromstringEl emisor, IP:port
bytesnumberEl tamaño del paquete
messagesobject[]Cada mensaje del paquete (un bundle tiene varios): address y args (OscArg[])
errorEngineError or nullosc.packet_malformed cuando el paquete no se decodificó (entonces messages está vacío)

osc://gen-tick ​

El progreso de un generador OSC: por cada mensaje por debajo de 60 mensajes por segundo; por encima, por cada n-ésimo, siendo n la tasa dividida entre 30 y redondeada hacia abajo — de 30 a 45 veces por segundo.

CampoTipoSignificado
job_idnumberLa tarea del generador
tsnumberCuándo
valuenumberEl valor recién enviado, antes de redondearse a un entero o a un float de 32 bits
sentnumberMensajes enviados hasta ahora

http://burst-progress ​

Las cifras de una ráfaga HTTP, cada 100 ms mientras se ejecuta, y una vez más con done: true cuando termina sola.

CampoTipoSignificado
job_idnumberLa tarea de la ráfaga
tsnumberCuándo
sentnumberSolicitudes respondidas o fallidas hasta ahora
oknumberDe esas, respondidas con un estado 2xx
failednumberDe esas, con cualquier otro estado o sin respuesta
missednumberLas solicitudes de una ráfaga regulada que esperaron demasiado a un trabajador libre y se omitieron
rpsnumberSolicitudes por segundo durante los últimos 100 ms; en el último evento, durante toda la ráfaga
last_latency_ms, min_latency_ms, max_latency_ms, avg_latency_msnumberLatencias hasta ahora
p50_ms, p90_ms, p95_ms, p99_msnumberPercentiles de cada solicitud hasta ahora, fallos incluidos, con un margen del 0,5 %
donebooleanEl último evento de la ráfaga

ws://state ​

Una conexión WebSocket abierta por ws_connect se conectó o se cerró. Una conexión cuya tarea se detuvo no envía closed.

CampoTipoSignificado
job_idnumberLa tarea de la conexión
tsnumberCuándo
statestringconnected o closed
handshakeobjecturl, peer, local, protocol (el subprotocolo que eligió el servidor, o null) y ms (la conexión y el upgrade)
closedobject or nullCon closed: code, reason, by (client, server o lost) y error

ws://messages ​

Lo que una conexión WebSocket envió y recibió desde el último evento, cada 100 ms cuando hay algo.

CampoTipoSignificado
job_idnumberLa tarea de la conexión
tsnumberCuándo
messagesobject[]En orden: ts, dir (rx recibido, tx enviado), kind (text o binary), text (los primeros 64 KiB como UTF-8, también en un mensaje binario; los bytes que no lo son se convierten en �), hex (los primeros 4096 bytes de un mensaje binario como hex, si no null), bytes (el tamaño completo) y truncated (más de lo que se mostró: más de 64 KiB de texto, más de 4096 bytes de binario)
droppednumberMensajes excluidos de este evento porque había más de 2000; los más antiguos van primero

mqtt://state ​

El estado de una conexión MQTT cambió.

CampoTipoSignificado
job_idnumberLa tarea de la conexión
tsnumberCuándo
statestringconnected; subscribed tras cada respuesta a una suscripción; closed cuando la conexión terminó (no cuando se detuvo su tarea)
brokerstringhost:port
errorEngineError or nullPor qué terminó una conexión closed (transport.reset cuando el bróker la cerró); null en caso contrario
grantsobject[]Con subscribed: cada filtro pedido, con filter, qos (concedido) y accepted; vacío en caso contrario

mqtt://messages ​

Lo que una conexión MQTT recibió desde el último evento, cada 100 ms cuando hay algo. Un mensaje QoS 2 reentregado se muestra una vez.

CampoTipoSignificado
job_idnumberLa tarea de la conexión
tsnumberCuándo
messagesobject[]ts, topic, payload (como UTF-8; los bytes que no lo son se convierten en �), bytes, qos, retain, dup
droppednumberMensajes excluidos porque llegaron más de 4000 en 100 ms; los más antiguos van primero

mqtt://ack ​

El bróker completó algo que pidió la conexión.

CampoTipoSignificado
job_idnumberLa tarea de la conexión
tsnumberCuándo
kindstringpublished (una publicación QoS 1 o 2 está completa) o unsubscribed
packet_idnumberEl id del paquete MQTT
topicstring or nullEl tema publicado; null para unsubscribed

broadcast://emit-stat ​

Los contadores de una baliza, cada 250 ms, y una vez más cuando termina sola con pps 0.

CampoTipoSignificado
job_idnumberLa tarea de la baliza
tsnumberCuándo
targetsnumberDestinos en cada ronda
roundsnumberRondas enviadas
packets, bytesnumberDatagramas y bytes enviados
errorsnumberEnvíos que fallaron
ppsnumberDatagramas por segundo durante los últimos 250 ms

broadcast://peers ​

Lo que ha oído una escucha de descubrimiento, cada 400 ms.

CampoTipoSignificado
job_idnumberLa tarea de la escucha
tsnumberCuándo
peersobject[]El oído más recientemente primero: addr, proto, packets, bytes, first_ms, last_ms, last_summary, responded (sus paquetes que se respondieron, contados según llegaron); como máximo 512
packets, bytesnumberTodo lo recibido
responsesnumberRespuestas enviadas

netsim://stat ​

Los contadores de un relé de degradación, cada 250 ms. Los relés de los nodos Degradación de una ejecución informan en el informe de la ejecución.

CampoTipoSignificado
job_idnumberLa tarea del relé
tsnumberCuándo
received, forwardednumberDatagramas o fragmentos de entrada y salida
droppednumberPerdidos por loss, ráfagas u offline (UDP; un relé TCP retiene un flujo mientras está offline y no descarta nada)
throttlednumberUDP: descartados por el límite de ancho de banda, o porque ya había demasiados en camino. TCP: fragmentos que retuvieron su flujo por el límite de ancho de banda
duplicated, corrupted, reorderednumberLo que el perfil les hizo
bytesnumberBytes reenviados
connections, reset, stallednumberTCP: conexiones tomadas, restablecidas, dejadas a medias; se omite mientras sea 0
profilestringEl perfil con el que degrada ahora, como lo nombra la línea de tiempo: su nombre, o lo que hace (60 ms ±25 · loss 2%)

storm://stat ​

Los contadores de una tormenta, cada 250 ms, y una vez más cuando termina sola con pps y mbps 0.

CampoTipoSignificado
job_idnumberLa tarea de la tormenta
tsnumberCuándo
packets, bytesnumberDatagramas (o conexiones TCP) y bytes enviados
errorsnumberEnvíos o conexiones que fallaron
ppsnumberPor segundo durante los últimos 250 ms
mbpsnumberMegabits por segundo durante los últimos 250 ms

scan://open ​

El escáner encontró un puerto abierto.

CampoTipoSignificado
job_idnumberLa tarea del escaneo
tsnumberCuándo
portnumberEl puerto
bannerstring or nullLo que envió primero el servicio, cuando se pidieron banners y dijo algo en menos de 400 ms

scan://progress ​

Cómo de lejos va un escaneo: aproximadamente cada 1 % del rango, y cuando termina solo con done igual a total (ese puede llegar dos veces).

CampoTipoSignificado
job_idnumberLa tarea del escaneo
tsnumberCuándo
donenumberPuertos probados
totalnumberPuertos del rango
opennumberPuertos abiertos encontrados

emulator://activity ​

Lo que un emulador iniciado con emulator_start recibió y respondió desde el último evento, cada 200 ms cuando algo cambió (un intercambio, que se lo dejara caído o se lo levantara, o un mensaje que el bróker MQTT no pudo entregar). Los nodos Emulador de una ejecución no lo envían; sus contadores están en el informe de la ejecución.

CampoTipoSignificado
job_idnumberLa tarea del emulador
tsnumberCuándo
countsobjecttotal, unmatched, failed, down, hits (por regla), y missed (MQTT; se omite mientras sea 0) — como emulator_exchanges
forcedstringunavailable, reset o timeout mientras está caído; se omite en caso contrario
exchangesobject[]Los intercambios nuevos, como los enumera emulator_exchanges pero sin data; como máximo 200
droppednumberIntercambios más allá de los primeros 200 del intervalo, no enviados aquí; emulator_exchanges sigue teniendo los últimos 500

inspect://batch ​

Tramas nuevas del Inspector. Solo se envía mientras la captura está activada: cada 120 ms cuando hay tramas nuevas, y aproximadamente una vez por segundo cuando no hay ninguna, para que los contadores sigan al día.

CampoTipoSignificado
framesobject[]Las tramas nuevas, de la más antigua a la más reciente, como máximo 250; sin sus bytes (usa inspect_payload)
statsobjectLos contadores de la captura, CaptureStats
skipped_nownumberTramas capturadas desde el último lote pero que no están en este — llegaron más de 250, o el búfer las dejó ir. Siguen en una exportación mientras el búfer las retenga

server://lagged ​

Solo servidor. Este cliente se quedó más de 4096 eventos atrás y se perdió algunos. Lee el estado otra vez con comandos.

CampoTipoSignificado
skippednumberCuántos eventos se perdió