当前位置: 首页 > 工具软件 > Pinpoint > 使用案例 >

pinpoint设计思路

齐涛
2023-12-01

引言

编写本文档目的是说明pinpoint plugin如何开发。

pinpoint总体设计介绍

总体架构

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目录下。

Tomcat 插件

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目录下。

TongWeb插件如何实现

修改为对应的类和方法即可。

参考资料

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

 类似资料: