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 的对比