Skywalking agent源码分析
字节码技术
xxxxx介绍一下字节码技术
- JavaAgent ,启动时加载的 JavaAgent 是 JDK1.5 之后引入的新特性,此特性为用户提供了在 JVM 将字节码文件读入内存之后,JVM 使用对应的字节流在 Java 堆中生成一个 Class 对象之前,用户可以对其字节码进行修改的能力,从而 JVM 也将会使用用户修改过之后的字节码进行 Class 对象的创建。
- premain api,
public static void premain(String agentArgs, Instrumentation instrumentation);
public static void premain(String agentArgs);
入口方法
SkyWalkingAgent -> premain。目前暂时只支持冷启动,热部署的方式仍需官方持续改进。
1、核心配置加载方式:
例如:agent.service_name 和 collector.backend_service等配置
读取 skywalking_config -> 若没有则读取 /config/agent.config -> System.getProperties() 系统级的环境变量 来覆盖前者-> 挂载的探针参数 来覆盖前者
2、插件初始化:
- AbstractClassEnhancePluginDefine 是所有插件必须继承的抽象类
- 每个插件下都有一个skywalking-plugin.def文件,以key(插件名)=value(完整包路径)的形式定义了插件的声明(即增强的切入点)
3、插件(中间件or框架)的增强
增强点的寻找:
- NameMatch:是全路径找到增强点
- IndirectMatch:通过类注解@Trace等、继承关系,回调结果等等信息来辅助匹配寻找增强点