SkyWalking Agent 无侵入原理
SkyWalking 的 Java Agent 不需要改一行代码,就能自动采集链路数据。Java Agent 字节码增强技术是如何做到”无侵入”的?
一、链路追踪的核心概念
- 1.1 Trace——一次完整的请求链路
- 1.2 Span——链路中的一个操作单元
- 1.3 TraceId / SpanId / ParentSpanId
- 1.4 数据模型——Segment / Span / Tag / Log
二、SkyWalking 整体架构
- 2.1 Agent——采集端,字节码增强
- 2.2 OAP Server——接收分析端
- 2.3 UI——可视化展示
- 2.4 存储——ES / H2 / MySQL
三、Java Agent 技术
- 3.1 premain 方法——JVM 启动时加载
- 3.2
ClassFileTransformer.transform()——字节码修改 - 3.3 ByteBuddy 框架——比 ASM 更易用的字节码工具
- 3.4 类的匹配与拦截——
ElementMatcher
四、插件机制——如何拦截特定框架
- 4.1 Spring MVC 插件——拦截 Controller
- 4.2 Dubbo 插件——拦截 RPC 调用
- 4.3 MySQL 插件——拦截 JDBC 执行
- 4.4 自定义插件——
ClassEnhancePluginDefine
五、数据采集流程
- 5.1 入口 Span 创建——
ContextManager.createEntrySpan() - 5.2 出口 Span 创建——
ContextManager.createExitSpan() - 5.3 跨进程传播——Header 注入 TraceId
- 5.4 异步上报——gRPC 发送到 OAP
六、性能影响
- 6.1 字节码增强的性能损耗——< 5%
- 6.2 采样策略——
sampleRate控制 - 6.3 上报的异步化
七、总结
- SkyWalking 的无侵入来自于 Java Agent + ByteBuddy
- 与 Pinpoint / Zipkin 的对比
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!