10. Ereignis-Stream-Listener
Anmelden bei Veranstaltungskanal (Hafen 10020) und zeigt die Systemereignisse an, wobei eine Filterung nach Schweregrad, Namensmuster und Ausschluss optional möglich ist. Nur-Lese-Modus – es werden keine Sitzungsprofile erstellt und keine Befehle gesendet.
Was Sie lernen werden:
- Abonnieren Sie WebSocket-Ereignisse (Hafen
10020) als passiver Beobachter - Eine Analyse von JSON-Ereignis —
level,name,category,data,message - Nach minimalem Schweregrad filtern
- Namensübereinstimmung mit Platzhaltern und Ausschluss
- Nutzen Sie dieses Tutorial, um die Leistung der Parallelschleife parallel zu einem beliebigen anderen Tutorial zu bewerten.
Ablauf
- Die CLI-Optionen analysieren (
--level,--name,--exclude,--no-hide-rate,--port). - Anmelden bei
ws://localhost:10020(le Veranstaltungskanal) — Es wird kein Sitzungsprofil gesendet, da es sich um einen Beobachter im Nur-Lese-Modus handelt. - Für jede eingehende Nachricht das JSON-Ereignis analysieren und die Filter anwenden:
- Die Nachricht ignorieren, wenn
levelliegt unterhalb der Mindestschwere. - Wenn Gründe
--namesind vorhanden, die Meldung ignorieren, es sei denn, einer davon passt (zunameallein oder mitcategory/name). - Wenn ein Motiv
--excludeentsprechen, die Nachricht verwerfen.
- Die Nachricht ignorieren, wenn
- Die ausgewählten Ereignisse mit ihrer Schwere, ihrem qualifizierten Namen, der optionalen Meldung und der Nutzlast anzeigen
datafakultativ.
Einstellungen
| Option | Standardwert | Rolle |
|---|---|---|
--port | 10020 | Veranstaltungshafen |
-l, --level | info | Mindestschwere – einer der Werte info, notice, warning, error, critical, panic |
-n, --name | (keine) | Nur Ereignisse anzeigen, die dem Muster entsprechen (glob, wiederholbar) |
-x, --exclude | (keine) | Ereignisse ausblenden, die dem Muster entsprechen (glob, wiederholbar) |
--no-hide-rate | false | Ereignisse einbeziehen system-rate-report (standardmäßig ausgeblendet, da sehr ausführlich) |
Starten Sie ein beliebiges Tutorial (04-hello-floor, 05-position-control, 06-combined...) in einem Terminal, und der Ereignis-Listener mit --no-hide-rate in einem anderen. Das Ereignis system-rate-report enthält die effektive Tick-Frequenz des Geräts: Vergleichen Sie die Varianten Python / C++ nlohmann / C++ Glaze desselben Tutorials, um den Serialisierungsaufwand bei einer Regelschleife mit etwa 4 kHz zu beobachten.
# Terminal 1 — pick a variant
./04-haply-inverse-hello-floor # C++ nlohmann
./04-haply-inverse-hello-floor-glz # C++ Glaze
python 04-haply-inverse-hello-floor.py # Python
# Terminal 2 — watch the rate
./10-haply-inverse-events --no-hide-rate
Meister der Les-États
Jede eingehende Nachricht entspricht einem einzigen Ereignis:
level— Schwerkraft in Form einer Kette (info...panic)name— Name der Veranstaltung (z. B.device-connected,system-rate-report)category— Kategorie (z. B.device,session,system)message— optionale lesbare Zeichenkettedata— optionale verschachtelte JSON-Nutzdaten (die Struktur hängt vom Ereignis ab)
Vollständiges Verzeichnis der Ereignisse: Ereignisse und Überwachung.
Versand / Empfang
Passives Abonnement – allein recv() wird verwendet; es wird nichts zurückgegeben. Alle drei Varianten implementieren dieselbe Filterpipeline; der für die Inverse-API spezifischste Teil ist die Struktur des Ereignisses.
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocket ist die kürzeste Form der reinen Empfangsschleife.
async with websockets.connect(uri) as websocket:
async for msg in websocket:
try:
event = json.loads(msg)
except json.JSONDecodeError:
continue
if accept_event(event, min_level_index, name_patterns, exclude_patterns):
print(format_event(event))
Muster für eine Mahnung libhv — onmessage wird auf dem E/A-Thread ausgeführt; der Hauptthread wird blockiert, während er auf EINGABE wartet. Die Ereignisse werden als untypisierte JSON-Daten behandelt – jedes Feld wird über .value(...) mit einem Standardwert.
ws.onmessage = [&](const std::string &msg) {
json event;
try { event = json::parse(msg); } catch (...) { return; }
if (accept_event(event, opts.min_level, opts.name_patterns, opts.exclude_patterns))
print_event(event);
};
ws.open("ws://localhost:10020");
while (std::cin.get() != '\n') {} // block main thread
Die bekannten Ereignisfelder werden einer Struktur zugeordnet event_data typisiert. Das Feld data Resttyp glz::raw_json_view, damit beliebige (ereignisabhängige) verschachtelte Nutzdaten unverändert übertragen werden können, ohne dass ein vollständiges Schema definiert werden muss.
// Struct model — known fields typed, nested `data` kept as raw JSON
struct event_data {
std::string level;
std::string name;
std::string category;
std::string message;
glz::raw_json_view data{};
};
// Send / receive
ws.onmessage = [&](const std::string &msg) {
event_data event{};
if (glz::read<glz_settings>(event, msg)) return; // drop malformed
if (accept_event(event, opts.min_level, opts.name_patterns, opts.exclude_patterns))
print_event(event);
};
ws.open("ws://localhost:10020");
while (std::cin.get() != '\n') {} // block main thread
Das Tutorial 10 wird ebenfalls lokal mit dem SDK installiert – siehe tutorials/10-haply-inverse-events/ im Installationsverzeichnis des Dienstes.
Quelle: Python · C++ · C++ Glaze
Siehe auch: Ereignisse und Überwachung · WebSocket-Protokoll