HUATUO(华佗)是由滴滴开源并依托 CCF(中国计算机学会)孵化的操作系统深度观测项目,专注为云原生通用计算、AI 计算、云服务、基础服务等提供操作系统内核级深度观测能力。官网:https://huatuo.tech/
📖 概述
/v1/events/watch 是华佗(HUATUO)提供的实时内核事件订阅接口。客户端通过一次 HTTP POST 长连接即可持续接收节点上发生的内核异常事件。事件以 CloudEvents 1.0 规范封装,通过 Server-Sent Events(SSE) 协议推送。
🎯 应用场景
内核事件订阅将操作系统层的异常信号直接暴露给上层系统,消除了传统轮询带来的延迟与开销。以下是典型的集成场景。
故障自愈系统
内核事件是自愈决策的第一手信号源。订阅 events/watch 后,自愈控制器可在事件发生的瞬间触发处置动作,而不必等待监控系统的告警流转:
- OOM 自愈:收到
oom 事件后,立即对触发容器执行扩容、重启或流量摘除,将服务中断时间从分钟级压缩到秒级。 - Hung Task 自愈:收到
hungtask 事件后,自动隔离节点并驱逐 Pod,防止级联阻塞蔓延至整个集群。 - 网络故障自愈:收到
netdev_txqueue_timeout 或 netdev_bonding_lacp 事件后,触发网卡重置或流量切换,实现分钟级网络链路自愈。 - I/O 风暴自愈:收到
iotracing 事件后,结合 cgroup blkio 限速策略动态降低问题容器的磁盘 I/O 配额,保护同节点其他服务。
可观测性平台
将华佗内核事件接入可观测性平台,补齐应用指标和日志之外的内核视角:
- 事件时间线关联:将
softlockup、oom 等内核事件叠加到 Grafana 时间线上,与应用错误率、延迟曲线精确对齐,快速定位根因。 - 异常驱动告警:以内核事件替代固定阈值告警,降低误报率。例如收到
ras 硬件错误事件时直接触发高优告警,而不依赖 CPU 错误率超阈值。 - 容量与稳定性分析:长期订阅
memburst、dload 等 AutoTracing 事件,建立节点稳定性基线,为容量规划提供内核级依据。 - 多维下钻:事件中携带容器 ID、命名空间、地域等上下文,告警链接可直接下钻到对应的 Pod、Node、Region 视图。
安全审计与合规
- 异常行为检测:
oom、hungtask、softlockup 等事件若在非业务高峰期集中出现,可能指示资源滥用或恶意负载,触发安全审查流程。 - 事件留存与追溯:将 CloudEvents 事件流写入消息队列(Kafka、Pulsar)或对象存储,满足等保合规对系统异常事件留存的要求。
混沌工程与压测验证
- 故障注入验证:混沌工程平台注入网络延迟、内存压力等故障后,实时订阅
net_rx_latency、memburst 事件验证故障是否生效,取代人工观察。 - 压测基线建立:压测期间持续订阅全量事件,记录首个内核异常事件的出现时机,精确标定系统承压极限。
AIOps 智能运维
- 事件驱动根因分析:将内核事件作为特征输入 AI/ML 模型,结合应用指标进行多维根因推断,减少人工排查时间。
- 预测性维护:对
ras 硬件错误、netdev_bonding_lacp 等硬件层事件建模,在设备彻底失效前提前预警并触发迁移。 - 智能抑制与聚合:对同一时间窗口内同类事件自动聚合,避免告警风暴,向 On-call 工程师呈现精简的根因摘要。
💎 价值
🚀 使用
1. CloudEvents 规范说明
1.1 CloudEvents 1.0 信封字段
每条推送事件均为一个符合 CloudEvents 1.0 规范的 JSON 对象:
1.2 华佗事件数据结构(WatchEventData)
data 字段包含华佗的标准事件记录:
{"specversion":"1.0","id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","source":"/huatuo/node-1/oom","type":"tech.huatuo.kernel.event","datacontenttype":"application/json","time":"2026-05-18T10:23:45.123456789Z","data":{"hostname":"node-1","region":"cn-beijing","observed_timestamp":"2026-05-18T10:23:45Z","tracer_name":"oom","tracer_id":"abc123","tracer_run_type":"auto","container_id":"d3f1a2b4c5e6","container_hostname":"app-pod","container_host_namespace":"prod","container_type":"docker","container_qos":"Guaranteed"}}
WatchEventData 字段说明:
2. 支持的内核事件列表
3. POST 请求说明
3.1 接口地址
POST /v1/events/watch
3.2 请求头
Content-Type: application/json
3.3 请求体结构
{"filters":{"tracer_name":"<regex>","hostname":"<regex>","container_hostname":"<regex>","container_host_namespace":"<regex>","region":"<regex>"}}
filters 字段说明:
- 多个字段同时指定时,所有条件须同时满足(AND 语义)。
- 过滤器在服务端生效,仅匹配的事件才会推送到客户端。
3.4 响应格式(SSE 流)
连接建立后,服务端以 SSE 格式持续推送事件:
data: {"specversion":"1.0","id":"...","source":"/huatuo/node-1/oom",...}\n\n
服务端还会定期发送心跳注释行以保持连接:
: ping\n
4. EventsWatch 配置说明
在华佗配置文件(huatuo-bamai.conf)中通过 [EventsWatch] 段配置:
[EventsWatch]# 最大并发客户端连接数,超出后新连接返回 HTTP 429# Default: 100MaxClients=100# SSE 心跳间隔(秒),防止代理/负载均衡因空闲而断开连接# 连续 3 次心跳写入失败则主动关闭该客户端连接# Default: 30KeepAliveInterval=30
5. Curl 调用示例
5.1 订阅所有内核事件
curl -s -N -X POST http://<node-ip>:19704/v1/events/watch \ -H "Content-Type: application/json"\ -H "Accept: text/event-stream"\ -H "Cache-Control: no-cache"\ -H "Connection: keep-alive"\ -d '{}'
5.2 只订阅 OOM 事件
curl -s -N -X POST http://<node-ip>:19704/v1/events/watch \ -H "Content-Type: application/json"\ -H "Accept: text/event-stream"\ -H "Cache-Control: no-cache"\ -H "Connection: keep-alive"\ -d '{"filters": {"tracer_name": "^oom$"}}'
5.3 订阅指定节点的网络类事件
curl -s -N -X POST http://<node-ip>:19704/v1/events/watch \ -H "Content-Type: application/json"\ -H "Accept: text/event-stream"\ -H "Cache-Control: no-cache"\ -H "Connection: keep-alive"\ -d '{ "filters": { "hostname": "^node-1$", "tracer_name": "netdev|dropwatch|net_rx_latency" } }'
5.4 订阅 prod 命名空间的容器事件
curl -s -N -X POST http://<node-ip>:19704/v1/events/watch \ -H "Content-Type: application/json"\ -H "Accept: text/event-stream"\ -H "Cache-Control: no-cache"\ -H "Connection: keep-alive"\ -d '{ "filters": { "container_host_namespace": "^prod$" } }'
说明:-N 参数禁用 curl 缓冲,使 SSE 事件即时输出到终端。