天天看点

pinpoint2.2.X disable组件的bug及解决

故事由来:

我们前不久使用了pinpoint2.2.1,并且配置了Error事件发送邮件给技术团队,有同事反馈收到的邮件有问题,经过了解是这样的:我们有一个获取用户头像的功能,如果图片在服务器不存在,这时我们使用默认图片进行替换。但是我们明明已经catch并处理了url地址图片文件不存在的异常,但是pinpoint上还是会有error存在。我怀疑是pinpoint专门加了扑捉HttpUrlConnection的功能。

pinpoint2.2.X disable组件的bug及解决

问题原因:

果然发现pinpoin有一个叫pinpoint-jdk-http-plugin的plugin,然后开始想办法怎么能够让它不发挥作用。

1.从agent/plugin的目录下把这个插件删除,但是我们是批量部署的这个agent,如果有的服务器需要,有的服务器不需要就很难以管理

2.从配置文件里进行禁用,这个我觉得比较适合,找了一台服务器做实验,修改profile/release目录下的pinpoint.config文件,找到profiler.plugin.disabe= 这一行,在后面添加上你需要屏蔽的插件,这里要说一下,csdn上有一篇博文写了屏蔽插件的原理和配置,原理很好,后面给我分析问题原因提供了很大的帮助,但是配置由于版本的更新已经不是那么配了,所以如果有看了那篇博文配置失败的朋友往后看就知道原因了:

第一次修改(不生效):

配置文件里的注释说的很清楚,内容如下:

# Needs to be a comma separated list of plugin's groupId:artifactId
# Ex: com.navercorp.pinpoint:pinpoint-tomcat-plugin, com.navercorp.pinpoint:pinpoint-jboss-plugin      

查看了pinpoint-jdk-http-plugin插件的pom.xml,就知道了groupId和artifactId

profiler.plugin.disable=com.navercorp.pinpoint:pinpoint-jdk-http-plugin

重启服务,然而,没有生效。

第一次不生效的原因分析:

看日志:

pinpoint2.2.X disable组件的bug及解决

注意红框部分,这里disabledPlugins竟然是空的。

查看了源码,发现在DefaultProfilerConfig类中,加载profiler.plugin.disable的方法名称是get*****,一般设置值的操作不应该名称是get,这点不合逻辑,但是名字只是名字,如果调用了也不会有问题,还需要继续跟踪,

pinpoint2.2.X disable组件的bug及解决

顺着配置文件的加载方法一路追踪,发现对于value注解的处理在ValueAnnotationProcessor类中进行,最终会到下面截图中的方法判断这是不是需要执行注入config配置文件中的值到DefaultProfilerConfig实例的过程,其中一点就是判断这个方法是不是set开头,这里是get,那么在这里就return false,就被跳过了,导致没有加载我们刚才添加的设置。

pinpoint2.2.X disable组件的bug及解决

第二次解决(成功):

然后我把这里的方法修改了个名字

pinpoint2.2.X disable组件的bug及解决

然后编译,把jar包替换agent目录/boot/pinpoint-bootstrap-core-2.2.1.jar,再重启,查看启动日志:

pinpoint2.2.X disable组件的bug及解决

应该是生效了。

后记:

在github上我提了一个bug,我发现到我发文为止,最新版的2.2.2还是有这个问题的,但是master分支上的代码已经解决了,并且master分支的工程结构相比较2.2.X有了比较大的变化。