10. Écouteur de flux d'événements
Se connecter àCanal des incidents(port) 10020), affiche les événements système et permet un filtrage facultatif par niveau, modèle de nom et règles d'exclusion. Lecture seule : n'utilise pas de profil de session et n'envoie aucune commande.
Contenu pédagogique :
- S'abonner en tant qu'observateur passifÉvénement WebSocket(port)
10020) - AnalyseÉvénement JSON —
level,name,category,data,message - Filtrer par niveau de gravité le plus faible
- Correspondance et exclusion des noms de caractères génériques
- À associer à ce tutoriel et à n'importe quel autre tutoriel poureffectuer des tests de référence sur la boucle de contrôle
Processus de travail
- Analyse des options de ligne de commande (
--level,--name,--exclude,--no-hide-rate,--port). - Se connecter à
ws://localhost:10020(c'est-à-direCanal des incidents) — Comme il s'agit d'un observateur en lecture seule, aucun profil de session n'est envoyé. - Pour chaque message reçu, analyser le JSON de l'événement et appliquer les règles de filtrage :
- Si
levelSi le niveau de gravité est inférieur au seuil minimal, le message est ignoré. - Si l'on spécifie
--namemotif, alors uniquement si l'un de ces motifs correspond (correspond ànameen soi oucategory/name) ; sinon, il est ignoré. - Si l'un quelconque
--excludeSi la correspondance de motif est valide, elle est ignorée.
- Si
- Imprimer les événements conservés, y compris leur niveau, leur nom complet, le message (facultatif) et (éventuellement)
dataCharge.
Paramètres
| Paramètres | Valeur par défaut | Utilisation |
|---|---|---|
--port | 10020 | Port de canal d'événements |
-l, --level | info | Niveau de gravité le plus bas ; valeurs possibles : info,notice,warning,error,critical,panic l'un d'entre eux |
-n, --name | (aucun) | Afficher uniquement les événements correspondant à ce modèle (caractères génériques « glob », pouvant être répétés) |
-x, --exclude | (aucun) | Masquer les événements correspondant à ce motif (caractères génériques « glob », pouvant être spécifiés plusieurs fois) |
--no-hide-rate | false | Comprend system-rate-report Événements (masqués par défaut en raison de leur volume important) |
Exécutez n'importe quel tutoriel (04-hello-floor, 05-position-control, 06-combined…) dans un terminal, puis dans un autre terminal, à l'aide de --no-hide-rate Lancer l'écouteur d'événements.system-rate-report Cet exemple illustre la fréquence de tick effective de l'appareil : en comparant les versions Python / C++ de nlohmann et C++ de Glaze issues du même tutoriel, on constate une surcharge liée à la sérialisation sur la boucle de contrôle à environ 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
Champs d'état lus
Chaque message reçu constitue un événement :
level— Niveau de gravité sous forme de chaîne de caractères (info...panic)name— Nom de l'événement (par exempledevice-connected,system-rate-report)category— Catégorie (par exempledevice,session,system)message— Chaîne de caractères lisible (facultative)data— Charge JSON imbriquée facultative (structure dépendant de l'événement concerné)
Pour consulter la liste complète des événements, rendez-vous sur la page «Événements et surveillance».
Envoyer / Recevoir
Abonnement passif — Utilisation exclusive recv(), sans renvoyer de contenu. Le processus de filtrage est identique dans les trois versions ; l'élément à noter concernant l'API Inverse est la structure des objets événementiels.
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocket C'est la façon la plus simple d'écrire une boucle de réception.
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))
Modèle de rappel libhv ——onmessage S'exécute sur un thread d'E/S, tandis que le thread principal reste bloqué en attendant que l'on appuie sur la touche ENTRÉE. L'événement est considéré comme un JSON sans type : chaque champ est passé via une fonction acceptant une valeur par défaut. .value(...) Lire.
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
Les champs d'événement connus sont mappés à un type event_data Structure.data Le champ est conservé sous la forme glz::raw_json_view, ce qui permet de transférer telles quelles toutes les charges imbriquées (dont la structure dépend de l'événement concerné), sans avoir à définir un schéma complet.
// 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
Le tutoriel 10 est également installé localement avec le SDK. Veuillez vous rendre dans le répertoire d'installation du service, sous tutorials/10-haply-inverse-events/ Rechercher dans.
Code source : Python · C++ · C++ Glaze
Contenu associé : Événements et surveillance · Protocole WebSocket