10. イベントストリームリスナー
に接続する イベント一覧 (ポート 10020) システムイベントを表示し、レベル、名前のパターン、除外条件によるフィルタリングを任意で設定できます。読み取り専用 — セッションプロファイルは作成されず、コマンドも送信されません。
学習内容:
- 購読する WebSocketイベント (ポート
10020) 受動的な観察者として - 分析する JSONイベント —
level,name,category,data,message - 深刻度の最低レベルでフィルタリングする
- ワイルドカードによる名前の照合と除外
- このチュートリアルを使用して、他のどのチュートリアルと並行してでも、制御ループの性能を評価してください
進行
- CLI オプションを分析する (
--level,--name,--exclude,--no-hide-rate,--port). - ログイン
ws://localhost:10020(le イベント一覧) — 読み取り専用のオブザーバーであるため、セッションプロファイルは送信されません。 - 受信する各メッセージについて、JSONイベントを解析し、フィルタを適用します:
- 以下の場合はメッセージを無視してください
levelは、最小の重症度レベルを下回っている。 - もし理由があるなら
--nameが提供されている場合は、そのいずれかに一致する場合を除き、そのメッセージを無視してください(name一人で、またはcategory/name). - もしある理由があれば
--exclude対応する、メッセージを却下する。
- 以下の場合はメッセージを無視してください
- 選択されたイベントを、そのレベル、完全な名前、オプションのメッセージ、およびペイロードとともに表示する
data通性。
パラメータ
| オプション | デフォルト値 | 役割 |
|---|---|---|
--port | 10020 | イベント・ポート・デュ・カナル |
-l, --level | info | 最小重み — 価値観の一つ info, notice, warning, error, critical, panic |
-n, --name | (なし) | (glob、繰り返し可能)というパターンに一致するイベントのみを表示する |
-x, --exclude | (なし) | (glob、繰り返し可能)というパターンに一致するイベントを非表示にする |
--no-hide-rate | false | イベントを含める system-rate-report (デフォルトでは非表示になっています。コメントが非常に多いからです) |
ターミナルで任意のチュートリアル(04-hello-floor、05-position-control、06-combined…)を実行すると、イベントリスナーが --no-hide-rate 別のものの中で。その出来事 system-rate-report この変数には、デバイスの実効ティック周波数が格納されています。同じチュートリアルの Python 版、nlohmann C++ 版、Glaze C++ 版を比較すると、約 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
よく読まれている記事
受信する各メッセージは、1つのイベントに対応します:
level— チェーン状の重み(info...panic)name— イベント名(例:device-connected,system-rate-report)category— カテゴリ(例:device,session,system)message— 任意の可読文字列data— オプションのネストされたJSONペイロード(構造はイベントによって異なります)
イベントの完全な一覧:イベントと監視。
送信/受信
パッシブ・サブスクリプション — 単独 recv() が使用されます。何も返されません。3つのバリエーションはいずれも同じフィルタリングパイプラインを実装しています。Inverse APIに最も特有な部分は、イベントの構造です。
- Python
- C++ (nlohmann)
- C++ (Glaze)
async for msg in websocket これは、受信ループのみの場合の最も短い形式です。
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))
libhvのリコールモデル — onmessage I/Oスレッド上で実行されます。メインスレッドは、入力待ちの状態になります。イベントは型指定のないJSONとして処理され、各フィールドは .value(...) デフォルト値が設定されています。
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
既知のイベントフィールドは、ある構造体にマッピングされます event_data 型指定。フィールド data 型残余 glz::raw_json_view, これにより、(イベントに依存する)任意の入れ子構造を持つペイロードを、完全なスキーマを定義することなく、そのまま送信できるようになる。
// 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
チュートリアル10もSDKとともにローカルにインストールされています。詳しくは tutorials/10-haply-inverse-events/ サービスのインストールディレクトリ内。
関連項目: イベントと監視·WebSocketプロトコル