事件
通过 svc.events 订阅运行态事件。
每个事件触发时都会再打 add_logged(等级跟随源事件),无论是否另订了对应事件。绑 add_logged 即可收到中文消息。
IOPS 和网卡链路都不走事件:add_io_status_changed / add_link_changed 能订阅、不报错,但永远不会触发(见 收不到的两个)。要 IOPS 读 io_status,要链路读 diag_snapshot.link_up。
功能概览
| 类别 | 事件 | 说明 | 自动日志 |
|---|---|---|---|
| 连接 | svc.events.add_connected_changed | 与 IO 控制器的周期交换通断 | ✓ |
| 运行态 | svc.events.add_state_changed | 运行态变化 | ✓ |
| 运行错误 | svc.events.add_error_occurred | 运行错误 | ✓ |
| IOPS | svc.events.add_io_status_changed | 收不到,别订 | — |
| 链路 | svc.events.add_link_changed | 收不到,别订 | — |
| 日志 | svc.events.add_logged | 上面每条事件都会再打这条 | — |
add_io_status_changed 和 add_link_changed 都能注册成功、不给任何报错,但回调一次都不会被调用。
所以「订了之后一直没动静」不能当成「IOPS 一直是好的」,也不能当成「网卡一直是好的」。这两样请轮询 io_status 与 diag_snapshot.link_up。
连接
add_connected_changed
svc.events.add_connected_changed(callback)
周期数据交换通断时触发(connected == False 且 ever_connected == True = 掉线;ever_connected == False = 从未连上)。
回调参数:
class PnSConnectedChangedEvent:
connected: bool # 当前是否在换周期数据
ever_connected: bool # 是否曾经连上过
level: PnSEventLevel # 连接 = Info;掉线 / 从未连上 = Warn
示例:
def on_connected(e):
if not e.connected and e.ever_connected:
print("掉线")
svc.events.add_connected_changed(on_connected)
运行态
add_state_changed
svc.events.add_state_changed(callback)
运行态变化时触发(SDK 只观测,不主动切状态)。
回调参数:
class PnSStateChangedEvent:
old_state: Any # 变化前,见 [PnSState](./api#pnsstate)
new_state: Any # 变化后
level: PnSEventLevel # Info
示例:
svc.events.add_state_changed(lambda e: print(f"{e.old_state} → {e.new_state}"))
add_error_occurred
svc.events.add_error_occurred(callback)
运行错误出现时触发;e.error_code 是 int 原值,枚举形态请用 svc.error_code。
回调参数:
class PnSErrorOccurredEvent:
error_code: int # 运行错误原值(不是枚举)
message: str # 中文消息
level: PnSEventLevel # Warn
示例:
svc.events.add_error_occurred(lambda e: print(f"{e.error_code}: {e.message}"))
收不到的两个
add_io_status_changed 和 add_link_changed 能通过编译、能注册成功,但永远不会触发 —— 派发它们的观测路径没有调用方。列在这里只为了对照:在 API 里看见这两个名字时,别指望回调。
add_io_status_changed
svc.events.add_io_status_changed(callback)
回调参数:(当前不会被调用)
class PnSIoStatusChangedEvent:
iops_bad: int # IOPS 非 GOOD 的字节数(status != 0x80)
level: PnSEventLevel # BAD > 0 = Warn;否则 Info
要 IOPS 质量请轮询 io_status。
add_link_changed
svc.events.add_link_changed(callback)
回调参数:(当前不会被调用)
class PnSLinkChangedEvent:
link_up: bool # 物理链路是否 Up
level: PnSEventLevel # Up = Info;Down = Warn
要网卡链路请读 diag_snapshot.link_up。
日志
add_logged
svc.events.add_logged(callback)
每个事件触发时都会再打这条,等级跟随源事件。
回调参数:
level(PnSEventLevel) — 日志级别message(str) — 日志正文
PnSEventLevel
日志级别。取值见 枚举参考。
示例:
svc.events.add_logged(lambda level, message: print(f"[{level.name}] {message}"))