10. Ereignis-Stream-Listener
Veranstaltungskanal(Port 10020) wird eine Verbindung hergestellt, um Systemereignisse auszugeben, die optional nach Ebene, Namensmuster und Ausschlusskriterien gefiltert wurden. Da es sich um einen schreibgeschützten Vorgang handelt, werden weder Sitzungsprofile gesendet noch Befehle übertragen.
Lerninhalte:
- Als passiver Beobachter Ereignis-WebSocket(Port
10020) Abonnieren - Ereignis-JSON Parsen —
level,name,category,data,message - Nach dem niedrigsten Schweregrad filtern
- Anwenden von Platzhaltern beim Abgleichen und Ausschließen von Namen
- Verwenden Sie dieses Tutorial zusammen mit anderen Tutorials, um Regelkreise zu benchmarken
Arbeitsablauf
- CLI-Flag (
--level,--name,--exclude,--no-hide-rate,--port) wird geparst. ws://localhost:10020(Veranstaltungskanal) verbunden. Da es sich um einen schreibgeschützten Beobachter handelt, werden keine Sitzungsprofile übertragen.- Für jede eingehende Nachricht wird das Ereignis-JSON-Objekt geparst und der folgende Filter angewendet:
levelLiegt der Schweregrad unter diesem Mindestwert, wird der Eintrag verworfen.--nameWenn ein Muster festgelegt wurde, dann eines der Muster (nameallein odercategory/name) nicht übereinstimmt, wird es verworfen.--excludeSobald auch nur eines der Muster übereinstimmt, wird es verworfen.
- Ereignisse, die den Filter passiert haben, nach Ebene, vollständigem Namen, optionaler Meldung, optionaler
dataGibt zusammen mit der Nutzlast aus.
Parameter
| Flagge | Standardwert | Verwendungszweck |
|---|---|---|
--port | 10020 | Ereigniskanal-Port |
-l, --level | info | Niedrigster Schweregrad — info, notice, warning, error, critical, panic eines davon |
-n, --name | (keine) | Es werden nur Ereignisse angezeigt, die dem Muster (glob, wiederholbar) entsprechen |
-x, --exclude | (keine) | Ereignisse ausblenden, die einem Muster (glob, wiederholbar) entsprechen |
--no-hide-rate | false | system-rate-report Ereignisse eingeschlossen (standardmäßig ausgeblendet – sehr umfangreiche Ausgabe) |
Führen Sie in einem Terminal ein beliebiges Tutorial (04-hello-floor, 05-position-control, 06-combined...) aus und in einem anderen Terminal --no-hide-rate Führen Sie den Ereignis-Listener unter Angabe der Optionen aus. system-rate-report Das Ereignis enthält die effektive Taktfrequenz des Geräts. Vergleicht man diesen Wert zwischen den Python-/C++- und den nlohmann-/C++-Glaze-Versionen desselben Tutorials, lässt sich ein Serialisierungs-Overhead von etwa 4 kHz im Regelkreis feststellen.
# 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
Feld „Lesestatus“
Jede eingehende Nachricht ist ein Ereignis:
level— Schweregrad von Zeichenfolgen (info...panic)name— Name der Veranstaltung (z. B.:device-connected,system-rate-report)category— Kategorie (z. B.:device,session,system)message— Optionaler, für Menschen lesbarer Textdata— Optionale verschachtelte JSON-Nutzdaten (die Struktur variiert je nach Ereignis)
Eine vollständige Liste der Ereignisse finden Sie unter „Ereignisse und Überwachung“.
Senden / Empfangen
Da es sich um ein manuelles Abonnement handelt, recv()Sie werden lediglich verwendet, ohne dass etwas zurückgegeben wird. Alle drei Varianten implementieren dieselbe Filter-Pipeline; ein bemerkenswerter Aspekt der auf die Inverse-API zugeschnittenen Teile ist die Form der Ereignis-Struktur.
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocketDies ist die knappste Form einer schreibgeschützten Schleife.
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))
Das libhv-Callback-Modell — onmessagewird in einem E/A-Thread ausgeführt, während der Hauptthread auf die Eingabe der ENTER-Taste wartet und dabei blockiert ist. Das Ereignis wird als typfreies JSON-Format betrachtet, wobei jedes Feld einen Standardwert enthält und .value(...)Das liest man so.
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 vom Typ event_data wird einer Struktur zugeordnet. data Das Feld ist glz::raw_json_viewDa dies beibehalten wird, können beliebige, je nach Ereignis variierende verschachtelte Payloads 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
Das Tutorial 10 ist ebenfalls zusammen mit dem SDK lokal installiert. Im Installationsverzeichnis des Dienstes unter tutorials/10-haply-inverse-events/Bitte sehen Sie dort nach.
Quellcode: Python · C++ · C++ Glaze
Verwandte Dokumente: Ereignisse und Überwachung · WebSocket-Protokoll