故事由来:
我们前不久使用了pinpoint2.2.1,并且配置了Error事件发送邮件给技术团队,有同事反馈收到的邮件有问题,经过了解是这样的:我们有一个获取用户头像的功能,如果图片在服务器不存在,这时我们使用默认图片进行替换。但是我们明明已经catch并处理了url地址图片文件不存在的异常,但是pinpoint上还是会有error存在。我怀疑是pinpoint专门加了扑捉HttpUrlConnection的功能。
问题原因:
果然发现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
重启服务,然而,没有生效。
第一次不生效的原因分析:
看日志:
注意红框部分,这里disabledPlugins竟然是空的。
查看了源码,发现在DefaultProfilerConfig类中,加载profiler.plugin.disable的方法名称是get*****,一般设置值的操作不应该名称是get,这点不合逻辑,但是名字只是名字,如果调用了也不会有问题,还需要继续跟踪,
顺着配置文件的加载方法一路追踪,发现对于value注解的处理在ValueAnnotationProcessor类中进行,最终会到下面截图中的方法判断这是不是需要执行注入config配置文件中的值到DefaultProfilerConfig实例的过程,其中一点就是判断这个方法是不是set开头,这里是get,那么在这里就return false,就被跳过了,导致没有加载我们刚才添加的设置。
第二次解决(成功):
然后我把这里的方法修改了个名字
然后编译,把jar包替换agent目录/boot/pinpoint-bootstrap-core-2.2.1.jar,再重启,查看启动日志:
应该是生效了。
后记:
在github上我提了一个bug,我发现到我发文为止,最新版的2.2.2还是有这个问题的,但是master分支上的代码已经解决了,并且master分支的工程结构相比较2.2.X有了比较大的变化。