事件
通过 svc.events 订阅运行态事件。
自动日志
每个事件触发时都会再打 add_logged(等级跟随源事件),无论是否另订了对应事件。绑 add_logged 即可收到中文消息。
网卡链路不走事件:add_link_changed 能订阅、不报错,但不会触发(见 链路)。要链路读 diag_snapshot.link_up。
IO 质量走 add_io_status_changed。第一次读到 IOPS 只记基线,不回调。inputIopsHex 与 outputIopsHex 都缺则不虚构、不回调。非 GOOD 字节计数变化才回调。六种语言同一口径,不是每次读都回调。
功能概览
| 类别 | 事件 | 说明 | 自动日志 |
|---|---|---|---|
| 连接 | svc.events.add_connected_changed | 与 IO 控制器的周期交换通断 | ✓ |
| 运行态 | svc.events.add_state_changed | 运行态变化 | ✓ |
| 运行错误 | svc.events.add_error_occurred | 运行错误 | ✓ |
| IO 质量 | svc.events.add_io_status_changed | 非 GOOD 字节计数变化 | ✓ |
| 链路 | svc.events.add_link_changed | 收不到,别订 | — |
| 日志 | svc.events.add_logged | 上面每条事件都会再打这条 | — |
危险
add_link_changed 订了也不会响add_link_changed 能注册成功、不给任何报错,但回调不会被调用。订了之后一直没动静不能当成网卡一直是好的。请读 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}"))
IO 质量
add_io_status_changed
svc.events.add_io_status_changed(callback)
第一次读到 IOPS 只记基线,不回调。inputIopsHex 与 outputIopsHex 都缺则不虚构、不回调。非 GOOD 字节计数变化才回调。不是每次读都回调。
回调参数:
class PnSIoStatusChangedEvent:
iops_bad: int # IOPS 非 GOOD 的字节数(status != 0x80)
level: PnSEventLevel # BAD > 0 = Warn;否则 Info
链路
add_link_changed
svc.events.add_link_changed(callback)
能注册成功,但不会触发。要网卡链路请读 diag_snapshot.link_up。
回调参数:
class PnSLinkChangedEvent:
link_up: bool # 物理链路是否 Up
level: PnSEventLevel # Up = Info;Down = Warn
日志
add_logged
svc.events.add_logged(callback)
每个事件触发时都会再打这条,等级跟随源事件。
回调参数:
level(PnSEventLevel) — 日志级别message(str) — 日志正文
PnSEventLevel
日志级别。取值见 枚举参考。
示例:
svc.events.add_logged(lambda level, message: print(f"[{level.name}] {message}"))