10. Ereignis-Stream-Listener
Veranstaltungskanal(Anschluss 10020) verbunden und gibt Systemereignisse aus, wobei beliebige Filterung nach Ebene, Namensmuster und Ausschlusskriterien erfolgt. Da es sich um einen schreibgeschützten Modus handelt, werden weder Sitzungsprofile noch Befehle gesendet.
Was Sie in diesem Tutorial lernen werden:
- Als passiver BeobachterEreignis WebSocket(Anschluss
10020) zu abonnieren - Veranstaltung JSONAnalyse —
level、name、category、data、message - Filterung nach dem niedrigsten Schweregrad
- Namensabgleich und -ausschluss mithilfe von Platzhaltern
- Verwenden Sie dieses Tutorial zusammen mit anderen Tutorials, umRegelkreise zu benchmarken.
Workflow
- CLI-Flag (
--level、--name、--exclude、--no-hide-rate、--port) analysieren. ws://localhost:10020(Veranstaltungskanal) verbunden. Da es als schreibgeschützter Beobachter fungiert, wird kein Sitzungsprofil gesendet.- Für jede empfangene Nachricht wird das Ereignis-JSON-Datenformat analysiert und ein Filter angewendet:
levelWenn der Wert unter dem Mindestschweregrad liegt, wird er verworfen.--nameWenn ein Muster angegeben ist, wird der Eintrag verworfen, sofern er nicht mit einem der Muster übereinstimmt (nameEinzeln odercategory/name(wird abgeglichen).--excludeWenn eine Übereinstimmung mit einem der Muster vorliegt, wird die Nachricht verworfen.
- Die verbleibenden Ereignisse nach Level, Bezeichner, (optionaler) Meldung, (optionaler)
datawird zusammen mit der Nutzlast ausgegeben.
Parameter
| Flag | Standard | Verwendungszweck |
|---|---|---|
--port | 10020 | Port des Ereigniskanals |
-l, --level | info | Niedrigster Schweregrad.info、notice、warning、error、critical、panic eines von beiden |
-n, --name | (keine) | Nur Ereignisse anzeigen, die dem Muster entsprechen (glob, mehrere Angaben möglich) |
-x, --exclude | (keine) | Ereignisse ausblenden, die einem Muster entsprechen (glob, mehrere Angaben möglich) |
--no-hide-rate | false | system-rate-report Ereignisse einbeziehen (standardmäßig ausgeblendet – da sie sehr viel Rauschen verursachen) |
Führen Sie ein beliebiges Tutorial (04-hello-floor, 05-position-control, 06-combined...) in einem Terminal aus und in einem anderen Terminal --no-hide-rate Führen Sie den angegebenen Ereignis-Listener aus.system-rate-report Die Veranstaltung umfasst die effektive Tick-Rate der Geräte. Vergleichen Sie die Python-/C++- und die nlohmann-/C++-Glaze-Versionen desselben Tutorials und überprüfen Sie den Overhead bei der Serialisierung in einem Regelkreis mit etwa 4 kHz.
# 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
Ausgelesene Zustandsfelder
Jede empfangene Nachricht stellt ein Ereignis dar:
level— Schweregrad der Zeichenfolge (info...panic)name— Name der Veranstaltung (Beispiel:device-connected、system-rate-report)category— Kategorie (Beispiel:device、session、system)message— Eine beliebige, für Menschen lesbare Zeichenfolgedata— Beliebige verschachtelte JSON-Nutzdaten (das Format variiert je nach Ereignis)
Eine vollständige Übersicht über alle Ereignisse finden Sie unter „Ereignisse und Überwachung “.
Senden / Empfangen
Für das passive Abonnement,recv() Es wird ausschließlich verwendet, es wird nichts zurückgegeben. Alle drei Varianten implementieren dieselbe Filter-Pipeline. Ein besonderer Aspekt der Inverse-API ist die Struktur der Ereignisobjekte.
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocket ist die kürzeste Schreibweise für eine reine 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))
Dies ist das Callback-Verfahren von libhv.onmessage wird in einem I/O-Thread ausgeführt, während der Hauptthread auf die Eingabe der ENTER-Taste wartet. Das Ereignis wird als typfreies JSON behandelt, wobei jedes Feld einen Standardwert besitzt. .value(...) wird gelesen.
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
Bekannte Ereignisfelder sind typisierte event_data wird auf die Struktur abgebildet.data Das Feld ist glz::raw_json_view Da diese beibehalten werden, können beliebige verschachtelte Payloads (die je nach Ereignis variieren) ohne Definition eines vollständigen Schemas unverändert weitergeleitet werden.
// 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
Auch Tutorial 10 ist zusammen mit dem SDK lokal installiert. Im Installationsverzeichnis des Dienstes befindet sich tutorials/10-haply-inverse-events/ Bitte überprüfen Sie dies.
Quelle: Python · C++ · C++ Glaze
Siehe auch: Ereignisse und Überwachung · WebSocket-Protokoll