pinpoint 插件开发实战

资源文件pinpoint agent在启动的时候,会加载plugin文件夹下所有的插件。它会扫描插件jar包中META-INF/services目录下的两个配置文件来确认ProfilerPlugin和TraceMetadataProvider的实现类。META-INF/services/com.naercorp.pinpoint.bootstrap.plugin.ProfilerPlugin: 1com.isuwang.dapeng.pinpoint.plugin.DapengPinpintPlugin META-INF/services/com.navercorp.pinpoint.common.trace.TraceMetadataProvider: 1com.isuwang.dapeng.pinpoint.plugin.DapengTraceMetadataProvider TraceMetadataProvider只需要实现setup方法,添加ServiceType和AnnotationKey, 主要用于服务类型和记录的数据的标识,agent上送给collector, collector和web通过它们区分不同的服务节点类型。 12345678910111213141516public class DapengTraceMetadataProvider implements TraceMetadataProvider { public static ServiceType DAPENG_PROVIDER_SERVICE_TYPE = ServiceTypeFactory.of(1999, "DAPENG_PROVIDER", RECORD_STATISTICS); public static ServiceType DAPENG_CONSUMER_SERVICE_TYPE = ServiceTypeFactory.of(9999, "DAPENG_CONSUMER", RECORD_STATISTICS); public static AnnotationKey DAPENG_ARGS_ANNOTATION_KEY = AnnotationKeyFactory.of(900, "dapeng.args", VIEW_IN_RECORD_SET); public static AnnotationKey DAPENG_RESULT_ANNOTATION_KEY = AnnotationKeyFactory.of(999, "dapeng.result", VIEW_IN_RECORD_SET); @Override public void setup(TraceMetadataSetupContext context) { context.addServiceType(DAPENG_PROVIDER_SERVICE_TYPE); context.addServiceType(DAPENG_CONSUMER_SERVICE_TYPE); context.addAnnotationKey(DAPENG_ARGS_ANNOTATION_KEY); context.addAnnotationKey(DAPENG_RESULT_ANNOTATION_KEY); }} 注意这里的ServiceType和AnnotationKey的code是有范围的.RECORD_STATICSTICS类型的ServiceType, agent会统计它的耗时。VIEW_IN_RECORD_SET属性的AnnotationKey将会在调用树状图中行显示。

发布于 technology

pinpoint插件原理学习

主要节选翻译自官方文档 Pinpoint Plugin Developer Guide 在pinpoint里面,一个“事务”(或者说请求?)是由一组spans构成的。每个span代表了请求经历的一个单独的逻辑节点。 一个span记录了重要方法的信息和它们的相关数据,请求,返回值等,概括它们为spanEvents. 一个span和它包含的所有spanEvents代表了一个方法调用。 PinPoint插件结构pinpoint插件是由TraceMetadataProvider和ProfilerPlugin的实现组成。TraceMetadataProvider的实现提供了ServiceType和AnnotationKey给PinPoint agent/web/collector. ProfilerPlugin的实现被agent使用,用来修改目标类,记录跟踪数据。 插件放在agent的plugin目录,web和collector的WEB-INF/lib目录。插件需要在资源文件夹的META-INF/services目录中,声明自己实现的TraceMetadataProvider和ProfilerPlugin。 TraceMetadataProviderServiceType每个Span和SpanEvent都包含了ServiceType, 代表了正在追踪的方法属于谁。web也需要通过serviceType来展示。 需要注意的是,每个ServiceType由name,code,description,properties组成。其中,code是不能乱用的,每个serviceType的code唯一。因此,pinpoint预留了一部分code范围供我们自己开发使用。 AnnotationKey同样的,AnnotationKey也有自己的唯一code, 900-999是pinpoint团队为我们预留的。 ProfilerPluginprofilerPlugin修改目标类以收集跟踪数据。 它工作的步骤是: jvm 启动时启动pinpoint agent agent加载插件目录下所有的插件 agent调用每个插件的ProfilerPlugin.setup(ProfilerPluginsetupContext)方法 在setup方法里面,插件决定是否要转换类,并且注册一个transformerCallerBack 应用启动 每次类加载的时候,agent会寻找注册在该类上的TransformerCallback 如果找到了,agent会调用callback里面的doInTransform方法 TransformerCallerBack会修改目标类的字节码,添加拦截,添加字段等等 修改后的字节码被返回给jvm,然后类被加载 应用继续 当一个修改后的方法被调用时,注入的拦截器before和after方法会被调用 拦截器纪录追踪数据

发布于 technology

pinpoint 安装配置

本文记录了pinpoint的安装、配置和使用过程。

发布于 technology