pinpoint Agent-启动加载插件分析

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值