10. 이벤트 스트림 리스너
연결하기사건 채널(포트) 10020), 시스템 이벤트를 출력하며, 수준, 이름 패턴 및 제외 규칙에 따라 선택적으로 필터링할 수 있습니다. 읽기 전용 — 세션 프로필을 사용하지 않으며, 어떠한 명령도 전송하지 않습니다.
학습 내용:
- 수동적인 관찰자로서 구독하기사건 WebSocket(포트)
10020) - 분석사건 JSON —
level、name、category、data、message - 가장 낮은 심각도 수준으로 필터링
- 와일드카드 이름 일치 및 제외
- 이 튜토리얼을 다른 튜토리얼과 결합하여제어 루프에 대한 벤치마크 테스트를 수행하는 데 사용합니다.
업무 흐름
- 명령줄 옵션 분석 (
--level、--name、--exclude、--no-hide-rate、--port). - 연결하기
ws://localhost:10020(즉사건 채널)——이것은 읽기 전용 관찰자이므로 세션 프로필을 전송하지 않습니다. - 수신된 각 메시지에 대해 이벤트 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/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
읽은 상태 필드
수신된 각 메시지는 하나의 이벤트입니다:
level— 문자열 형식의 심각도 수준 (info...panic)name— 사건명 (예:device-connected、system-rate-report)category— 범주 (예:device、session、system)message— 선택 사항인 가독성 있는 문자열data— 선택적 중첩 JSON 페이로드(구조는 특정 이벤트에 따라 다름)
전체 이벤트 목록은 ‘이벤트 및 모니터링’을참조하십시오.
보내기 / 받기
수동 구독 — 사용만 recv(), 어떠한 내용도 반환하지 않습니다. 세 가지 버전의 필터링 프로세스는 동일하며, 주목할 만한 Inverse API 고유 부분은 이벤트 구조체의 형태입니다.
- 파이썬
- 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 스레드에서 실행되며, 메인 스레드는 ENTER 키가 눌릴 때까지 차단된 상태로 대기합니다. 이벤트는 유형이 지정되지 않은 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/ 에서 검색하세요.
소스 코드: Python · C++ · C++ Glaze
관련 내용: 이벤트 및 모니터링 · WebSocket 프로토콜