异常事件字段
本文说明异常事件的记录结构、字段和适用限制。功能介绍见异常事件诊断,采集设置见节点配置。
事件记录
结果按已启用的存储配置写入 Elasticsearch 或本地文件。查询时按 tracer_type=event、事件名称、主机或容器及时间范围筛选。下列 JSON 为结构示例,省略部分公共字段;其中阈值说明使用内置默认值。
容器字段仅在关联到容器时提供;具体事件数据位于 tracer_data。
| 字段 | 说明 |
|---|---|
hostname |
节点主机名 |
region |
节点所属区域 |
uploaded_timestamp |
数据上传时间 |
container_id |
容器 ID |
container_hostname |
容器主机名 |
container_host_namespace |
容器的 Kubernetes 命名空间 |
container_type |
容器类型,例如 normal 普通容器,sidecar 边车容器等 |
container_qos |
容器 QoS 级别 |
tracer_name |
事件名称(如 sched_tick、memory_oom_kill 等) |
tracer_id |
本次追踪 ID |
observed_timestamp |
用户态观测时间 |
tracer_type |
观测类型,即时事件记录固定为 event |
tracer_data |
特定事件私有数据(详见各事件说明) |
CPU 调度
调度 tick 间隔
观测器:sched_tick。
检测相邻调度 tick 的总间隔;间隔达到阈值时记录当前内核调用栈和进程信息。该事件可发现 IRQ 长时间关闭、CPU 停顿或虚拟化调度延迟等问题,但不能单独证明软中断被禁用。comm 和 pid 表示上报 tick 所中断的任务,不表示造成延迟的任务。
适用场景
- 内核或驱动长时间关闭本地中断,或 hardirq/NMI 长时间占用 CPU。
- 虚拟机 vCPU 被宿主机长时间抢占,包括高 steal time 和调度停顿。
- SMI、固件停顿、clockevent 延迟投递或丢失等底层异常。
使用边界
成功进入 NO_HZ 的正常停 tick 会被过滤。普通 CPU 高负载或 softirq backlog 本身不等同于 tick 延迟。
阈值应高于目标机器的正常 tick 周期;事件栈仅表示延迟结束后首个 tick 的现场,需要结合 IRQ、steal time 和硬件指标定位根因。
示例(省略部分公共字段):
{
"uploaded_timestamp": "2025-06-11T16:05:16.251152703+08:00",
"hostname": "***",
"tracer_data": {
"tick_interval_ns": 237328905,
"tick_interval_threshold_ns": 10000000,
"comm": "***-agent",
"pid": 688073,
"cpu": 1,
"stack": "scheduler_tick/..."
},
"observed_timestamp": "2025-06-11T16:05:16.251+08:00",
"tracer_type": "event",
"region": "***",
"tracer_name": "sched_tick"
}
| 字段 | 说明 |
|---|---|
comm |
上报 tick 所中断任务的进程名称 |
stack |
延迟结束后的首个调度 tick 上采集的内核调用栈 |
tick_interval_ns |
相邻调度 tick 的总间隔(纳秒) |
cpu |
发生事件的 CPU 编号 |
tick_interval_threshold_ns |
调度 tick 间隔阈值(纳秒),达到该值则记录事件 |
pid |
上报 tick 所中断任务的进程 ID |
软锁死
观测器:softlockup。
记录内核报告 softlockup 时的进程、CPU 和 NMI 回溯信息;这些信息不能单独确定致因进程。触发时间由内核 watchdog 配置决定。
重复事件的上报间隔从 10 分钟递增至最长 3 小时,期间仍累计事件计数。
示例(省略部分公共字段):
{
"tracer_data": {
"cpu": 15,
"pid": 12345,
"comm": "kworker/15:0",
"cpus_stack": "2025-06-10 14:30:22 sysrq: Show backtrace of all active CPUs\nNMI backtrace for cpu 15\n..."
}
}
| 字段 | 说明 |
|---|---|
cpu |
发生 softlockup 的 CPU 编号 |
pid |
报告 softlockup 时的进程 PID |
comm |
报告 softlockup 时的进程名称 |
cpus_stack |
所有 CPU 的 NMI 回溯信息(多行文本,包含时间戳和调用栈) |
任务阻塞
观测器:hungtask。
可识别容器的 hungtask 事件附带容器 ID,否则保留主机输出;诊断堆栈仍为全机范围。计数说明见 HungTask 指标。
检测系统 hungtask 事件,采集 D 状态(不可中断睡眠)进程的内核栈及 CPU 回溯信息。重复事件的上报间隔从 10 分钟递增至最长 3 小时,期间仍累计事件计数。内核未提供 hung_task_timeout_secs 时不注册观测器;将该值设为 0 会禁用内核 hungtask 检测。
示例(省略部分公共字段):
{
"tracer_data": {
"tid": 2567042,
"comm": "kworker/u48:2",
"cpus_stack": "2025-06-10 09:57:14 sysrq: Show backtrace of all active CPUs\nNMI backtrace for cpu 33\n...",
"blocked_processes_stack": "task:java state:D stack: 0 pid: 12345 ..."
}
}
| 字段 | 说明 |
|---|---|
tid |
触发 hungtask 检测的任务 TID |
comm |
触发 hungtask 检测的任务名称 |
cpus_stack |
所有 CPU 的 NMI 回溯信息(多行文本,包含时间戳和调用栈) |
blocked_processes_stack |
D 状态进程的内核栈信息 |
hung_task_timeout_secs |
内核 hungtask 检测超时设置,单位为秒 |
内存
OOM 终止
观测器:memory_oom_kill。
记录 OOM Killer 的触发进程(trigger)与被终止进程(victim),以及可获取的容器、cgroup 和宿主机内存信息。触发进程不一定是主要内存消耗者,需结合使用量和内存限制分析。
示例(省略部分字段):
{
"tracer_name": "memory_oom_kill",
"tracer_data": {
"trigger": {
"memory_cgroup_css_addr": "0xff4b8d8be3818000",
"container_id": "example-container",
"container_hostname": "app-pod",
"pid": 3218804,
"comm": "java"
},
"victim": {
"memory_cgroup_css_addr": "0xff4b8d8be3818000",
"container_id": "example-container",
"container_hostname": "app-pod",
"pid": 3218745,
"comm": "java",
"cgroup": {
"path": "kubepods.slice/...",
"current": 2143289344,
"max": 2147483648,
"stat": {
"anon": 1509949440,
"file": 83886080
},
"events": {
"oom": 1,
"oom_kill": 1
}
}
},
"memory_snapshot": {
"host_meminfo": {
"MemAvailable": 3355443200,
"Cached": 1073741824,
"Slab": 268435456
}
}
}
}
| 字段 | 说明 |
|---|---|
trigger / victim |
触发进程与被终止进程,均使用下列进程字段 |
pid / comm |
PID 与进程命令名 |
container_id / container_hostname |
关联到的容器 ID 与主机名;未关联时省略 |
memory_cgroup_css_addr |
memory cgroup 指针的十六进制表示 |
cgroup.path |
容器 cgroup 路径 |
cgroup.current / cgroup.max |
读取快照时的内存使用量与上限,单位为字节 |
cgroup.stat / cgroup.events |
原始 cgroup 内存统计与事件计数;字段依 cgroup 版本而异 |
memory_snapshot.host_meminfo |
宿主机 /proc/meminfo 选定字段,统一转换为字节 |
cgroup 位于 trigger 或 victim 内,仅在容器关联和快照读取成功时提供。宿主机快照也可能缺失;这些信息在用户态读取,并非与 OOM 发生时刻严格同步。
直接回收
观测器:memory_reclaim_events。
记录线程单次直接内存回收的耗时。try_to_free_pages 返回时,若本次调用超过阈值(默认 900 毫秒),则上报进程、线程和容器信息。未解析到容器的事件保留到主机事件流。黑名单使用注册名 memory_reclaim_events,落盘记录的 tracer_name 为 memory_reclaim。
示例(省略部分公共字段):
{
"tracer_name": "memory_reclaim",
"tracer_data": {
"pid": 1896137,
"tid": 1896138,
"comm": "java",
"reclaim_duration_ns": 1412702917
}
}
| 字段 | 说明 |
|---|---|
comm |
触发直接内存回收的进程名称 |
pid |
触发进程的 PID |
tid |
触发线程的 TID |
reclaim_duration_ns |
直接回收耗时(纳秒) |
容器 ID 为空可能表示主机任务或容器归属未解析。已归属容器事件不重复输出到主机流。
网络
协议栈丢包
观测器:dropwatch。
检测内核网络协议栈中的丢包行为,输出丢包时的内核调用栈、网络五元组、TCP 状态等信息。可通过可选的调用栈过滤器抑制经本机验证的噪声模式。type 字段为兼容 TCP 丢包类型而预留,当前未赋值。
示例(省略部分公共字段):
{
"observed_timestamp": "2026-07-23T02:14:40.304775546Z",
"tracer_data": {
"drop_reason": "SKB_DROP_REASON_NOT_SPECIFIED",
"source": "events",
"comm": "kubelet",
"pid": 1687046,
"net_namespace_cookie": 123456789,
"net_namespace_inum": 402653184,
"netdev_queue_mapping": 3,
"netdev_linkstatus": ["linkStatusUp"],
"netdev_name": "eth0",
"netdev_ifindex": 2,
"packet_eth_proto": "0x0800",
"packet_len_bytes": 1460,
"layers": {
"label": "IPv4/TCP",
"ipv4": {
"saddr": "10.79.68.62",
"daddr": "10.134.72.4",
"protocol": "TCP"
},
"tcp": {
"sport": 8080,
"dport": 49000,
"seq": 1009085774,
"ack_seq": 689410995,
"sk_state": "ESTABLISHED"
}
},
"stack": "kfree_skb/..."
}
}
| 字段 | 说明 |
|---|---|
type |
预留丢包类型,当前未赋值且不会出现在 JSON 中;预留编码为 1(通用丢包)、2(SYN 洪泛)、3(半连接队列溢出)、4(全连接队列溢出) |
drop_reason |
内核数据包丢弃原因 |
source |
事件来源(独立运行 dropwatch 时为 tools,由 huatuo-bamai 启动时为 events) |
comm |
触发丢包的进程名称 |
pid |
进程 ID |
net_namespace_cookie / net_namespace_inum |
用于容器归属解析的网络命名空间值 |
netdev_queue_mapping |
网卡队列索引 |
netdev_linkstatus |
网卡链路状态标志列表 |
netdev_name |
网卡设备名称 |
netdev_ifindex |
网卡接口索引 |
packet_len_bytes |
数据包长度(字节) |
packet_eth_proto |
以太网协议类型的十六进制表示 |
layers.ipv4.saddr / layers.ipv4.daddr |
源 IP 和目的 IP 地址 |
layers.tcp.sport / layers.tcp.dport |
源端口和目的端口 |
layers.tcp.seq / layers.tcp.ack_seq |
TCP 序列号和确认序列号 |
layers.tcp.sk_state |
丢包时 TCP 连接状态 |
stack |
丢包发生时的内核调用栈 |
接收延迟
观测器:net_rx_latency。
记录 TCP 报文从驱动接收点到 __netif_receive_skb、tcp_v4_rcv 和用户态拷贝点的延迟。这三个值均从驱动起算,不是相邻观测点之间的耗时;默认阈值依次为 5、10、115 毫秒。达到对应阈值时记录端点、TCP 状态、序列号及延迟值。
默认排除宿主机网络命名空间,仅观测容器网络。
示例(省略部分公共字段):
{
"observed_timestamp": "2025-06-11T00:00:00Z",
"tracer_data": {
"comm": "nginx",
"pid": 2921092,
"latency_stage": "RX_STAGE_USERCOPY",
"latency_ms": 95973,
"latency_threshold_ms": 115,
"tcp_state": "ESTABLISHED",
"tcp_saddr": "10.156.248.76",
"tcp_daddr": "10.134.72.4",
"tcp_sport": 9213,
"tcp_dport": 49000,
"tcp_seq": 1009085774,
"tcp_ack_seq": 689410995,
"net_namespace_cookie": 123456789,
"net_namespace_inum": 402653184,
"packet_len_bytes": 26064
}
}
| 字段 | 说明 |
|---|---|
comm |
触发事件的进程名称 |
pid |
触发事件的进程 ID |
latency_stage |
延迟发生的阶段(RX_STAGE_NETIF 网卡到内核 / RX_STAGE_TCPV4 驱动到 TCP / RX_STAGE_USERCOPY 驱动到用户态拷贝) |
latency_ms |
实际延迟时间(毫秒) |
latency_threshold_ms |
触发事件的延迟阈值(毫秒) |
tcp_state |
TCP 连接状态(支持所有状态,如 ESTABLISHED、SYN_SENT、FIN_WAIT、TIME_WAIT 等) |
tcp_saddr / tcp_daddr |
源 IP / 目的 IP 地址 |
tcp_sport / tcp_dport |
源端口 / 目的端口 |
tcp_seq / tcp_ack_seq |
TCP 序列号 / 确认序列号 |
net_namespace_cookie |
网络命名空间 cookie(内核 ≥ 5.14 可用,用于高效容器关联) |
net_namespace_inum |
网络命名空间 inum |
packet_len_bytes |
数据包长度(字节) |
网卡状态
观测器:netdev_events。
通过订阅内核 netlink RTM_NEWLINK 消息,检测网卡链路状态标志变化(如 AdminDown、CarrierDown),输出接口名称、链路状态、MAC 地址及驱动信息。观测器启动时会扫描 EventTracing.Netdev.DeviceList 中配置的网卡当前状态作为基线,后续仅上报状态变化事件。
示例(省略部分公共字段):
{
"tracer_data": {
"ifname": "eth1",
"index": 3,
"linkstatus": "linkStatusAdminDown, linkStatusCarrierDown",
"mac": "5c:6f:69:34:dc:72",
"start": false,
"driver": "ixgbe",
"driver_version": "5.1.0-k",
"firmware_version": "3.25 0x80000421 1.2163.0"
}
}
| 字段 | 说明 |
|---|---|
ifname |
网络接口名称(如 eth1) |
index |
接口索引号 |
linkstatus |
链路状态变化描述(可包含多个状态) |
mac |
网卡 MAC 地址 |
start |
启动扫描标记;当前只保存实时变化事件,值为 false |
driver |
网卡驱动名称 |
driver_version |
网卡驱动版本 |
firmware_version |
网卡固件版本 |
LACP 状态
观测器:netdev_bonding_lacp。
仅在系统存在 IEEE 802.3ad bonding 接口时启用。LACP(Link Aggregation Control Protocol)状态变化时,读取并记录 /proc/net/bonding/ 下所有 bonding 接口的状态,包括模式、MII 状态、Actor/Partner 协商参数和 Slave 链路状态。
落盘记录的 tracer_name 为 lacp,配置黑名单使用注册名 netdev_bonding_lacp。
示例(省略部分公共字段):
{
"tracer_name": "lacp",
"tracer_data": {
"content": "/proc/net/bonding/bond0\nEthernet Channel Bonding Driver: v4.18.0...\nBonding Mode: IEEE 802.3ad Dynamic link aggregation\nMII Status: down\n..."
}
}
| 字段 | 说明 |
|---|---|
content |
完整的 bonding 接口状态信息(多行文本,包含所有 Slave 的 LACP 协商细节,等同于 /proc/net/bonding/bondX 文件内容) |
发送队列超时
观测器:netdev_txqueue_timeout。
检测网卡发送队列超时(TX queue timeout)事件,记录发生超时的队列索引、设备名称和驱动名称,用于排查发送方向的设备、驱动或链路异常。
示例(省略部分公共字段):
{
"tracer_data": {
"queue_index": 3,
"device_name": "eth0",
"driver_name": "ixgbe"
}
}
| 字段 | 说明 |
|---|---|
queue_index |
发生超时的发送队列索引 |
device_name |
网卡设备名称 |
driver_name |
网卡驱动名称 |
兼容性
OOM 名称迁移
OOM kill 追踪器现命名为 memory_oom_kill(此前为 memory_oom,更早为 oom),需同步更新黑名单、事件过滤器和告警查询。
指标前缀现为 huatuo_bamai_memory_oom_kill_,替代 huatuo_bamai_memory_oom_ 及更早的 huatuo_bamai_oom_,需同步更新指标仪表盘和记录规则。
历史事件保留原名称,跨版本查询需匹配这三个名称;内置事件仪表盘已覆盖三者。