pinpoint 笔记
APM对于目前的多点,分布式的应用中还是很重要也比较常见的,公司内部也有一个APM,使用 Java agent
作为探针,http单线程收集,实时写入到 ES
中,配合 kibana
的可视化也做到了基本的 PV
RT
等等的监控,但是受限于开发人员的不足,目前只能做到各个组件的rt监控,例如 mysql
redis
memcache
http
等等网络 IO的监控,对于 service Map 和 代码级监控就又些无力了,并且开发人员对于es的掌握水平也不一而足,因此引入一个简单的 APM
还是很有必要的 , 因为项目大部分都是部署在阿里云上,有采用pinpoint的意图。
安装
开发环境 : 安装 jdk6 , 7,8,9
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
export JAVA_9_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
export JAVA_6_HOME=/Library/Java/JavaVirtualMachines/jdk.1.6.0.jdk/Contents/Home
Note : 安装
jdk9
会影响到JD-GUI
的使用,出现闪退的情况.
pinpoint git 地址
pinpoint 目录下执行 mvn clean install -Dmaven.test.skip=true
执行完成即可完成 pinpoint 的安装,编译时间较长,我第一次大概5分钟,以后每一次编译大概3分钟左右
[INFO] pinpoint-web ....................................... SUCCESS [ 58.268 s]
[INFO] pinpoint-hbase-distribution ........................ SUCCESS [ 0.235 s]
[INFO] pinpoint-flink ..................................... SUCCESS [ 13.294 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:43 min
[INFO] Finished at: 2019-03-15T22:44:20+08:00
[INFO] Final Memory: 85M/804M
[INFO] ------------------------------------------------------------------------
安装tomcat(collector)
wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.zip
unzip apache-tomcat-8.5.35.zip
-- 拷贝pinpoint/collector/target/pinpoint-collector-1.9.0-SNAPSHOT.war 到tomcat的webapp目录下重新命令为ROOT.war,启动即可,目录开启 9994 9995 9996端口进行收集
➜ target git:(me) ✗ lsof -i:9994
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 66925 chenshun 244u IPv6 0xd6c726248693e2cd 0t0 TCP *:palace-3 (LISTEN)
安装tomcat(web 可视化)
安装tomcat过程如上,拷贝 web/target/pinpoint-web-1.9.0-SNAPSHOT.war 到webapp目录下重启接口
加入 javaagent
启动项目
-javaagent:/Users/chenshun/poipointshijian/agent/pinpoint-bootstrap-1.9.0-SNAPSHOT.jar -Dpinpoint.agentId=demo -Dpinpoint.applicationName=demo -noverify
Note:tomcat项目直接可直接使用pinpoint.config,springboot项目需要修改该文件
profiler.applicationservertype=SPRING_BOOT
profiler.tomcat.conditional.transform=false
issue地址 Unable to collect springboot info
这里就可以正常启动了.
分析
pinpoint优点
- agent注入,代码无侵入即可实现监控. 具体的实现原理和查看这个项目—> agent,对应classloader的理解和使用很有帮助
- dapper论文的实现 ps(还没有理解,技术上还实现不了)
- 代码级监控(对应public类都能实现类级别的监控,静态类目前还不行)
- serviceMap和异常监控
缺点
- 非异步监控,线程内启动就不能追踪
- 其他
论文看了,但是目前还没有看懂,至少已我的水平从技术角度还不能实现. 主要是span的产生,方法执行和出栈入栈以及收集到的数据如何存储的问题,hbase的存储格式没看懂
代码级监控主要使用 BeanMethodIntecepter
对用户方法进行拦截,reporter(methdDesc)即可实现代码级别的拦截.当前仅能实现public的代码级监控
serviceMap 还是和 dapper
联系在一起,实现起来还是较为简单,参考echarts#Graph图
总结
实际可以写的东西其实还挺少的,但是限制于 pinpoint
的中文资料比较少,我们去看的时候又比较麻烦,agent的使用模式也是花了几个晚上一步一步的调试出来的,期间对于classloader的理解可以说是指数级的增长,ASM部分是采用tree部分写的,我采用core部分写的,这里又花费了一些时间,至今还有部分问题待解决,dapper的理解留待后续补充.
2019-03-14
———
Dapper论文的阐述解决了分布式链路下的一个全链路监控的问题,我也抽时间写了第一个版本,其实最难的地方还是在于存储,以及UI的展示。单纯从agent上来理解其实挺简单的 (2021-07-18)