Witty-Insight架构深度剖析:从eBPF探针到HTTP API的全链路设计
Witty-Insight架构深度剖析从eBPF探针到HTTP API的全链路设计【免费下载链接】witty-insightThe witty-insight is an eBPF-based observability framework for tracing agent execution pipelines.项目地址: https://gitcode.com/openeuler/witty-insight前往项目官网免费下载https://ar.openeuler.org/ar/Witty-Insight是基于eBPF的可观测性框架专为追踪代理执行管道而设计。本文将深入解析其从内核态eBPF探针到用户态数据处理的全链路架构揭示如何实现高效、低侵入的系统观测能力。核心架构概览数据流水线设计Witty-Insight的核心是一条职责明确、数据单向流动的处理流水线从内核事件捕获到最终数据持久化共分为六个关键阶段Probes → Parser → Aggregator → Analyzer → GenAI → Storage每个阶段通过Rust枚举类型实现严格的数据接口定义确保数据流的类型安全和处理一致性。这种分层架构不仅便于模块独立开发和测试还能灵活应对不同类型的观测需求。1. eBPF探针层内核事件捕获Witty-Insight采用7个专业化eBPF探针从内核态捕获关键事件所有探针共享统一的环形缓冲区和进程追踪映射表由Probes管理器协调工作。探针类型与功能sslsniff通过uprobe技术附着于SSL_read/SSL_write函数捕获加密流量中的明文数据proctrace通过tracepoint监控进程execve事件获取命令行参数procmon跟踪进程生命周期创建/执行/退出驱动代理自动发现filewatch监控目标进程打开.jsonl文件的行为filewrite捕获目标进程写入.jsonl文件的内容udpdns拦截DNS查询解析目标域名tcpsniff捕获非加密的HTTP流量技术实现所有探针源码位于src/bpf/目录如sslsniff.bpf.c和proctrace.bpf.c。用户态处理逻辑在src/probes/目录下如probes.rs实现了统一的探针管理和事件分发。探针架构图2. 协议解析层事件标准化处理解析层接收来自探针的原始事件将其转换为标准化的ParsedMessage枚举类型支持多种协议和事件类型的解析pub enum ParsedMessage { Http(ParsedHttpMessage), // HTTP/1.x请求或响应 Http2(ParsedHttp2Frame), // HTTP/2帧 Sse(ParsedSseEvent), // SSE事件 Proc(ParsedProcEvent), // 进程事件 }解析策略HTTP/1.x状态机解析请求行/状态行/头部/正文HTTP/2解码HEADERS、DATA、SETTINGS等帧SSE解析data:行作为JSON数据进程事件解析execve命令行参数解析层的统一入口为Parser::parse_event()方法根据事件类型路由到相应的解析器处理。核心实现位于src/parser/unified.rs。3. 事件聚合层关联与上下文构建聚合层接收解析后的事件通过关联策略将相关事件组合成完整的业务实体pub enum AggregatedResult { HttpComplete(HttpPair), // HTTP请求-响应对 SseComplete(SsePair), // HTTP请求 SSE流响应 RequestOnly { request, .. }, // 超时未收到响应 ResponseOnly { response, .. },// 未找到匹配请求 ProcessComplete(AggregatedProcess), // 完整进程生命周期 Http2StreamComplete(Http2Stream), // HTTP/2流完成 }关联策略HTTP/1.x通过(pid, fd) LRU连接缓存匹配请求和响应HTTP/2按流ID聚合帧SSEHTTP请求 后续SSE事件流通过[DONE]标记结束进程聚合执行/退出事件形成完整生命周期聚合层还处理超时情况将未匹配的请求/响应输出为RequestOnly/ResponseOnly。实现代码位于src/aggregator/unified.rs。4. 分析层业务洞察提取分析层对聚合结果进行深度处理生成多种分析记录pub enum AnalysisResult { Audit(AuditRecord), // 审计记录 Token(TokenRecord), // 令牌使用记录 Http(HttpRecord), // HTTP数据记录 Message(ParsedApiMessage), // 解析的API消息 }分析流程进程事件→ 直接生成AuditRecordHTTP事件→ 并行处理AuditAnalyzer生成审计记录LLM调用、HTTP请求摘要TokenParser从SSE事件提取令牌使用情况提取原始HTTP数据生成HttpRecord令牌计算→ 如SSE中无令牌数据使用MultiModelTokenizer计算分析层实现位于src/analyzer/unified.rs其中令牌提取逻辑在src/analyzer/token/extractor/目录下。5. GenAI语义构建层智能事件建模GenAI层将分析结果转换为具有语义的AI事件如LLM调用、工具使用等pub enum GenAISemanticEvent { LLMCall(LLMCall), // 完整LLM调用 ToolUse(ToolUse), // 工具调用 AgentInteraction(AgentInteraction), // 代理交互 StreamChunk(StreamChunk), // 流式响应块 }构建策略从HTTP请求提取请求消息从SSE响应提取输出消息通过AgentMatcher将PID/comm映射到已知代理名称基于会话前缀和AtomicU64计数器生成唯一ID生成的语义事件通过GenAIExporter特性导出到多种后端本地JSONL文件、SQLite数据库或阿里云SLS。实现代码位于src/genai/builder.rs。6. 存储层数据持久化存储层负责将分析结果和GenAI语义事件持久化到多种存储系统SQLite表结构StoreTableContentAuditStoreaudit_events审计事件TokenStoretoken_records令牌使用记录HttpStorehttp_records原始HTTP数据TokenConsumptionStorestoken_consumption令牌消耗明细GenAISqliteStoregenai_eventsGenAI语义事件存储层实现位于src/storage/unified.rs和src/storage/sqlite/目录。全链路数据流程图以下是Witty-Insight从事件捕获到数据存储的完整数据流程图关键技术特性动态探针管理Witty-Insight采用动态探针附着策略不是在启动时附着所有探针而是在代理进程发现后按需附着。这种方式减少了系统开销提高了灵活性。相关实现见src/discovery/agent.rs和src/probes/sslsniff.rs。容错设计流水线采用宽松的错误处理策略探针层环形缓冲区轮询错误终止轮询线程但主线程不退出解析层解析失败静默忽略返回空ParseResult聚合层超时未匹配事件输出为RequestOnly/ResponseOnly分析层令牌提取失败尝试手动计算仍失败则跳过存储层存储失败仅记录警告不阻塞流水线设计原则是数据流水线不会因中间层错误而停止单个事件失败不影响其他事件处理。性能优化单轮询线程一个后台线程轮询环形缓冲区通过crossbeam通道分发事件LRU缓存HTTP连接聚合使用LRU缓存默认24个条目防止内存无限增长BPF侧过滤仅上传来自跟踪进程的数据减少内核-用户空间数据复制非阻塞设计Probes::try_recv()是非阻塞的空闲时主循环睡眠10ms总结Witty-Insight通过精心设计的eBPF探针和分层数据处理流水线实现了对代理执行管道的高效观测。其架构兼顾了性能、灵活性和可扩展性能够适应不同场景下的观测需求。无论是内核事件捕获、协议解析还是高级的GenAI语义构建每个组件都职责明确且接口清晰为构建可观测性系统提供了一个优秀的参考实现。通过本文的深度剖析希望能帮助开发者更好地理解Witty-Insight的内部工作原理从而更有效地使用和扩展这个强大的eBPF观测框架。完整的设计文档可参考docs/design-docs/目录下的详细资料。【免费下载链接】witty-insightThe witty-insight is an eBPF-based observability framework for tracing agent execution pipelines.项目地址: https://gitcode.com/openeuler/witty-insight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考