メインコンテンツへスキップ

10. イベントフローリスナー

接続先事件窓口(ポート 10020),システムイベントを出力し、レベル、名称パターン、および除外ルールに基づいて任意にフィルタリングすることができます。読み取り専用――セッションプロファイルは使用せず、コマンドも一切送信しません。

学習内容:

  • 受動的な観察者として購読する事件 WebSocket(ポート 10020)
  • 解析事件 JSON — level、name、category、data、message
  • 「深刻度の最低レベル」でフィルタリングする
  • ワイルドカード名の照合と除外
  • このチュートリアルと他の任意のチュートリアルを組み合わせて、制御ループのベンチマークテストを行う

ワークフロー​

  1. 解析コマンドラインオプション(--level、--name、--exclude、--no-hide-rate、--port)。
  2. 接続先 ws://localhost:10020(即事件窓口)——これは読み取り専用のオブザーバーであるため、セッションプロファイルは送信されません。
  3. 受信した各メッセージに対して、イベントの JSON を解析し、フィルタリングルールを適用します:
    • 若 level 最低の深刻度レベルを下回る場合は、破棄される。
    • もし指定された場合は --name パターンについては、そのうちのいずれかのパターンに一致した場合にのみ(一致 name それ自体、あるいは category/name)の場合は保持し、それ以外の場合は破棄する。
    • いずれか --exclude パターンに一致する場合は、破棄する。
  4. 保存されたイベントを、そのレベル、完全な名称、オプションのメッセージ、およびオプションの data 負荷。

パラメータ​

パラメータデフォルト値用途
--port10020イベントチャネルポート
-l, --levelinfo最低の深刻度レベル。選択可能な値は以下の通りです。 info、notice、warning、error、critical、panic の一つ
-n, --name(なし)このパターンに一致するイベントのみを表示します(glob ワイルドカード、複数指定可能)
-x, --exclude(なし)このパターンに一致するイベントを非表示にする(glob ワイルドカード、複数指定可能)
--no-hide-ratefalse含む system-rate-report 事件(出力量が多いため、デフォルトでは非表示)
制御ループのベンチマークテストを実施する

あるターミナルで任意のチュートリアル(04-hello-floor、05-position-control、06-combined……)を実行し、別のターミナルで --no-hide-rate イベントリスナーを実行します。system-rate-report この事例には、デバイスの有効なティックレートが含まれています。同じチュートリアルの Python / C++ nlohmann 版と C++ Glaze 版を比較すると、約 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固有の部分は、イベント構造体の形式です。

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))
SDK インストーラーに同梱されています

チュートリアル 10 も SDK とともにローカルにインストールされます。サービスのインストールディレクトリ内の tutorials/10-haply-inverse-events/ 中で探す。

ソースコード: Python·C++·C++ Glaze

関連コンテンツ: インシデントと監視·WebSocket プロトコル