编写本文档目的是说明pinpoint plugin如何开发。
pinpoint整体架构设计如下(插件主要在右上部Host JVM):
1、 启动jvm的时候通过javaagent启动pinpoint agent(PinpointBootStrap)。
2、Pinpoint agent加载plugin目录下的插件。
3、Pinpoint agent调用插件的ProfilerPlugin接口实现类的setup(ProfilerPluginSetupContext context)方法,并通过setTransformTemplate注入TransformTemplate实例。
4、在setup方法中,插件通过TransformTemplate注册需要拦截的类(需要字节码插入)和对应的TransformCallback回调函数(实现插入逻辑)
5、目标应用启动
6、每次加载class的时候,pinpoint agent判断该类是否注册了TransformerCallback回调函数(步骤4)
7、如果注册了TransformerCallback,调用回调函数doInTransform()方法。
8、回调函数中修改class的字节码(增加Interceptor接口实现)。例如tomcat:
9、返回修改后的字节码,jvm加载修改后的字节码。
10、应用启动完成。
11、当被修改的方法被调用时(例如startInternal()方法),会调用插入的Interceptor实现类的before和after方法
12、在before和after方法中记录跟踪数据。
1、 申请ServiceType Code(可选)
这个数字在pinpoint中是全局唯一的,申请后,拥有固定code,可以公开发布插件,不会和其他插件冲突;不申请的话需要自己定一个数字,不能和pinpoint的plugin目录下部署的插件冲突。 Code规则如下:
类型 范围
Server 1900 ~ 1999
DB Client 2900 ~ 2999
Cache Client 8900 ~ 8999
RPC Client 9900 ~ 9999
Others 7500 ~ 7999
2、 定义type-provider.yml文件
位置:META-INF/pinpoint/type-provider.yml
type-provider.yml中定义了插件的一些信息,参数说明见参考资料中的插件开发手册。如图:
3、 实现接口ProfilerPlugin
在setup()方法中拦截类,并注册TransformCallback回调函数,实现类配置在文件META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin
中。
4、 实现接口TransformCallback,在doInTransform()方法中修改类的字段或方法。
5、 实现接口AroundInterceptor,在before()和after()方法中做记录
6、 插件打成jar包。
7、 部署到pinpoint的plugin目录下。
1、 申请ServiceType Code(可选)
这个数字在pinpoint中是全局唯一的,申请后,拥有固定code,可以公开发布插件,不会和其他插件冲突;不申请的话需要自己定一个数字,不能和pinpoint的plugin目录下部署的插件冲突。 Code规则如下:
类型 范围
Server 1900 ~ 1999
DB Client 2900 ~ 2999
Cache Client 8900 ~ 8999
RPC Client 9900 ~ 9999
Others 7500 ~ 7999
2、 定义type-provider.yml文件
位置:META-INF/pinpoint/type-provider.yml
type-provider.yml中定义了插件的一些信息,参数说明见参考资料中的插件开发手册。如图:
3、 实现接口ProfilerPlugin
在setup()方法中拦截类,并注册TransformCallback回调函数,实现类配置在文件META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin
中。
4、 实现接口TransformCallback,在doInTransform()方法中修改类的字段或方法。
5、 实现接口AroundInterceptor,在before()和after()方法中做记录
6、 插件打成jar包。
7、 部署到pinpoint的plugin目录下。
修改为对应的类和方法即可。
1、 pinpoint架构
https://pinpoint-apm.github.io/pinpoint/overview.html
2、 插件开发手册
https://pinpoint-apm.github.io/pinpoint/plugindevguide.html
3、 模板工程
https://github.com/pinpoint-apm/pinpoint-plugin-template
4、 实例
https://github.com/pinpoint-apm/pinpoint-plugin-sample
5、 快速生成工具
https://github.com/bbossgroups/pinpoint-plugin-generate