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

  1. export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
  2. export JAVA_9_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
  3. export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
  4. 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分钟左右

  1. [INFO] pinpoint-web ....................................... SUCCESS [ 58.268 s]
  2. [INFO] pinpoint-hbase-distribution ........................ SUCCESS [ 0.235 s]
  3. [INFO] pinpoint-flink ..................................... SUCCESS [ 13.294 s]
  4. [INFO] ------------------------------------------------------------------------
  5. [INFO] BUILD SUCCESS
  6. [INFO] ------------------------------------------------------------------------
  7. [INFO] Total time: 03:43 min
  8. [INFO] Finished at: 2019-03-15T22:44:20+08:00
  9. [INFO] Final Memory: 85M/804M
  10. [INFO] ------------------------------------------------------------------------

安装tomcat(collector)

  1. wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.zip
  2. unzip apache-tomcat-8.5.35.zip
  3. -- 拷贝pinpoint/collector/target/pinpoint-collector-1.9.0-SNAPSHOT.war tomcatwebapp目录下重新命令为ROOT.war,启动即可,目录开启 9994 9995 9996端口进行收集
  4. target git:(me) lsof -i:9994
  5. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  6. 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 启动项目

  1. -javaagent:/Users/chenshun/poipointshijian/agent/pinpoint-bootstrap-1.9.0-SNAPSHOT.jar -Dpinpoint.agentId=demo -Dpinpoint.applicationName=demo -noverify

Note:tomcat项目直接可直接使用pinpoint.config,springboot项目需要修改该文件

  1. profiler.applicationservertype=SPRING_BOOT
  2. 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)