pinpoint Agent-启动加载插件分析

来源:互联网 发布:百度贴吧获取数据失败 编辑:程序博客网 时间:2024/05/18 03:11

Agent加载类采用了JDK的Instrumentation技术。

程序的入口为:com.navercorp.pinpoint.bootstrap.PinpointBootStrap,入口方法自然而然的是premain,      在此方法中没有什么关键的语句,无非就是获取环境变量,获取agent包的路径,加载到JDK的load中。最关键的一句就是bootStrap.start(),此方法调用PinpointStarter的start方法,此方法首先获取获取环境变量中配置的agentId和applicationName,并且校验。

然后采用Java的ServiceLoader类获取TraceMetadata、 ServiceType,通过TraceMetadata获取注解信息。读取配置信息。本方法最核心的就是创建agent,启动加载所有的核心也都在这个Agent类中,此类默认是DefaultAgent对象,通过反射机制创建的。


DefaultAgent对象的所有核心操作都在构造方法中。

其中加载插件的方法主要是pluginContexts = loadPlugins(agentOption);


追踪方法即到具体插件的的加载中


Load方法遍历加载每个plugin中的插件。其实是根据ServiceLoader加载的。


其中在preparePlugin方法中,可以看到自定义插件中的构造方法中的参加,就是在这里注入的。而plugin.setup(guardPluginContext)方法就是自定义插件中的需要实现的方法,其中自定义插件中的transformTemplate.transform就是调用的DefaultProfilerPluginContext.addClassFileTransformer.也就是本方法的第二行。

具体加载类文件,然后进行二进制操作的是instrumentation.addTransformer(wrappedTransformer, true);//ClassFileTransformerDispatcher

在此处instrumentation是ClassFileTransformerDispatcher的对象,跟踪代码到ClassFileTransformerDispatcher.transform0方法中。


而此处的transformer是MatchableClassFileTransformerGuardDelegate的对象,跟踪代码得到自定义插件中拦截方法的具体内容。


1 0