分布式服务调用链路追踪——Pinpoint
1. Pinpoint架构
官网地址:https://github.com/pinpoint-apm/pinpoint
从下图来看,Pinpoint主要分成几个部分:
Agent,负责从应用服务端收集数据,上传到collector;
Collector,负责接收Agent上传的数据,并存储到Hbase中;
Web,负责展示性能监控数据;
Hbase,负责存储性能监控数据;
2. 支持模块
到pinpoint的github官方地址查看支持的模块:
3. 版本兼容矩阵
从这里来看,collector和web目前仍然只支持JDK8,而Agent最高已经可以支持JDK14:
Hbase建议使用1.2.x或者1.4.x版本:
4. 安装Hbase
版本:
- HBase-2.0.0
Hbase支持集群或者单机部署,集群部署比较麻烦点,需要先部署zookeeper和hadoop集群,这也是很多人觉得 pinpoint的存储过于笨重的原因,
但是其实我们可以采用单机部署,就可以简单很多,因为普通压力下, APM的监控数据,并不需要这么强大的存储负载均衡能力。如需安装集群HBase,请参考我的HBase集群安装部署文章。
下载地址:https://archive.apache.org/dist/hbase/
解压 tar -xvzf hbase-2.0.0-bin.tar.gz 修改conf下的hbase-site.xml文件,指定数据的存储位置。 添加 <configuration> <property> <name>hbase.rootdir</name> <value>file:///data/pinpoint/hbase</value> </property> </configuration> 修改conf下的hbase-env.sh文件 添加jdk,并且使用hbase自带的zk: export JAVA_HOME=/usr/local/java/jdk1.8.0_191 export HBASE_MANAGES_ZK=true 启动 ./bin/start-hbase.sh
启动hbase后,访问ip:16010/master-status后观察Master和Region server是否显示的是主机名即可。
初始化HBase表:
Hbase安装完毕后,我们先把pinpoint需要的hbase表创建出来,通过执行如下命令创建:
创建Hbase Schemas ,下载文件到hbase shell执行
https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-create.hbase
bin/hbase shell hbase-create.hbase 注意:pinpoint默认的TTL存储策略是存储一年的,如果pinpoint监控的系统请求量是很大的,那么需要注意pinpoint所在服务器的存储空间是否够用。 解决方案:修改上述hbase建表脚本中的TTL值,比如: create 'AgentInfo', { NAME => 'Info', TTL => 31536000(改为604800,存储7天), DATA_BLOCK_ENCODING => 'PREFIX' }
一共是15张表。至此hbase就搭建完成了。
5. 编译Pinpoint
版本:
- JDK-1.6、JDK-1.7、JDK-1.8、JDK1.9
- Pinpoint-2.2.2
问题现像:如果使用了hbase2.X作为Pinpoint的数据存储,那么就会遇到搭建完毕之后,web上的数据有一些异常,特别是首页上看不到应用的server map特别明显,且右边的Response Summary也不显示请求统计。
解决方案:需要自己编译源码,替换掉Pinpoint默认带的hbase client 1.X版本,变成2.X才可以。
解决方法:
- 因为打包的时候要依赖java1.6(建议使用1.6.0_45)、java1.7(建议使用1.7.0_80)、java1.8(建议使用jdk1.8.0_191)、java1.9(建议使用9.0.4)环境,所以这几个版本的java都需要安装及配置环境变量;
- 安装及配置maven,版本这里建议使用3.5.x版本(本文使用3.5.4),使用3.6.1版本编译会报错;
-
JAVA_HOME=/home/software/java/jdk1.8.0_191 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH export JAVA_6_HOME=/home/software/java/jdk1.6.0_45 export JAVA_7_HOME=/home/software/java/jdk1.7.0_80 export JAVA_8_HOME=/home/software/java/jdk1.8.0_191 export JAVA_9_HOME=/home/software/java/jdk-9.0.4 export MAVEN_HOME=/usr/local/apache-maven-3.5.4 export PATH=${MAVEN_HOME}/bin:${PATH}
- 官网github下载pinpoint-2.2.2.tar.gz并解压;
- 修改源码中的pom.xml,把hbase.shaded.client.version值改成hbase的版本2.0.0
-
进入源码的根目录,执行以下命令进行编译:
-
./mvnw clean install -P hbase2,release -DskipTests=true
- 编译成功后,进入源码的以下目录,获取相关包:
-
../pinpoint-2.2.2/collector/target/deploy/pinpoint-collector-boot-2.2.2.jar 收集端包 ../pinpoint-2.2.2/web/target/deploy/pinpoint-web-boot-2.2.2.jar 页面包 ../pinpoint-2.2.2/agent/target/pinpoint-agent-2.2.2.tar.gz 探针包
../pinpoint-2.2.2/hbase/scripts/hbase-create.hbase 建表文件 - 检查collector和web包下的hbase版本是否正确:
6. 部署Pinpoint-collector
启动:nohup java -Dpinpoint.zookeeper.address=172.16.10.73:2181,172.16.10.76:2181,172.16.10.78:2181 -jar /home/software/pinpoint-hbase2/pinpoint-collector-boot-2.2.2.jar >./pinpoint-collector.log 2>&1 & 机器有启用防火墙的,注意放开:TCP 9991~9994端口,UDP 9995~9996端口
7. 部署Pinpoint-web
启动:nohup java -Dserver.port=8088 -Dpinpoint.zookeeper.address=172.16.10.73:2181,172.16.10.76:2181,172.16.10.78:2181 -jar /home/software/pinpoint-hbase2/pinpoint-web-boot-2.2.2.jar >./pinpoint-web.log 2>&1 & 其他同上 访问端口: http://172.16.208.79:8088/
8. 程序接入Pinpoint
上传pinpoint-agent-2.0.1.tar.gz 包到服务器任意目录,解压:
tar -zxvf pinpoint-agent-2.2.2.tar.gz
-
1.
修改配置
修改文件/profiles/release/pinpoint.config,
将collector的ip配置为监控收集服务pinpoint-collector的IP:
-
2.
修改采集比例
默认只有5%,如果没有改,会感觉好像采集不到监控数据:
-
3.
应用日志中输出transaction-id
修改agent/pinpoint.config
:
profiler.logback.logging.transactioninfo=true
logback通过%X{PtxId}
输出TransactionId
,%X{PspanId}
输出SpanId
:
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <charset>UTF-8</charset> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %black(%d{ISO8601}) [%X{PtxId},%X{PspanId}] %highlight(${LOG_LEVEL_PATTERN:-%5p}) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable </pattern> </layout> </encoder>
-
4.
应用集成pinpoint-agent
JAR file:
在启动你的应用程序的命令行中添加 -javaagent
参数. 并确保在-jar
参数之前添加它。
-javaagent:/home/perf/pinpoint/pinpoint-bootstrap-2.2.2.jar -Dpinpoint.agentId=serviceName -Dpinpoint.applicationName=applicationName
Tomcat:
修改 tomcat/bin/catalina.sh
,在首行加入如下信息:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:${pinpointPath}/pinpoint-bootstrap-2.2.2jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=masl01"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=masl"
参数说明:
-
-javaagent:
:指定PinPoint代理;-Dpinpoint.agentId=
:必须全局唯一,代表一个服务、应用实例,建议用hostname,部署多个jvm的话加前缀;-Dpinpoint.applicationName=
:指定服务、应用名称。相同服务部署不同实例,applicationName
相同,agentId
不同;
Idea:
-javaagent:D:\soft\pinpoint-hbase2\pinpoint-agent-2.2.2-masl\pinpoint-bootstrap-2.2.2.jar -Dpinpoint.agentId=localmasl -Dpinpoint.applicationName=masl -Dspring.profiles.active=release
9. 验证测试
访问相关业务请求,然后刷新Pinpoint,主界面如下图所示:
应用、中间件、DB之间的调用关系链路清晰:
jvm、cpu、gc信息简单明了:
10. 其它
Hbase修改TTL存储策略
{hbase_home}/bin/hbase shell --进入shell命令行 desc 'AgentInfo' 修改1天后过期 disable 'AgentInfo' alter 'AgentInfo',NAME=>'Info',TTL=>'43200' enable 'AgentInfo' desc 'AgentStatV2' 修改1天后过期 disable 'AgentStatV2' alter 'AgentStatV2',NAME=>'S',TTL=>'86400' enable 'AgentStatV2'
Hbase删除或者刷新表
# 创建表 https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-create.hbase {hbase_home}/bin/hbase shell hbase-create.hbase # 删除表 https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-drop.hbase {hbase_home}/bin/hbase shell hbase-drop.hbase # 刷新表(清空数据) https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-flush-table.hbase {hbase_home}/bin/hbase shell hbase-flush-table.hbase
11. 功能介绍
图片标注注释:
- 项目名称(可以上下拉动选择不同项目)
- 入站和出站(可以根据不同出入数生成不同的map图)
- 时间选择,左至右顺序,日历,5秒,20秒,1小时,3小时,6小时,12小时,1天,2天
- 根据2生成的链路图,相关联的程序之间的走向
- 动态实时走势图,一个请求算是一个点,红点是请求失败,y轴表示请求时间
- 程序资源使用情况,包括使用的cpu,内存,mysql的并发等。
- 根据请求时间对数量进行统计(一段时间内,请求耗时1秒钟的数量,3秒钟的数量,5秒钟的数量,慢请求,错误)
- 一段时间的请求使用柱状图展示,下面的颜色进行区分
特别注意事项5:
上图5中是请求的url统计,可以使用鼠标右键选择部分请求,松开鼠标跳到下面这个页面
标注注释:
1、是请求的url,所在服务器的IP,pinpoint客户端定义的server名称以及时间。 如果有错误的请求,在Exception栏有一个标志
2、是请求的url的相信信息,请求调用的函数,函数中查询的数据库语句,在这里有几个关键词,分别是Gap(ms),Exec(ms),Exec(ms),self(ms),看一下这几个关键词的意思:
Gap -- Elapsed time between the start of the previous method and the entry of this method(从上一个方法的开始到该方法的输入之间经过的时间)
Exec -- Duration of the method call from entry to exit(方法调用从入口到出口的持续时间)
Exec(%) -- ⬤ The execution time of the method call as a percentage of the total execution time of the transaction(方法调用的执行时间占事务总执行时间的百分比)
–- ⬤ A percentage of the self execution time(自执行时间的百分比)
Self -- Duration of the method call from entry to exit, excluding time consumed in nested methods call(方法调用从入口到出口的持续时间,不包括嵌套方法调用中消耗的时间)
特别注意事项6
在首页的标注6里有两个选项,分别是VIEW SERVERS和Inspector。VIEW SERVERS展示的是在一个项目中运行在两台服务器上处理的请求对比。
如上图,在Servers List中有两台服务器运行同一个服务,pinpoint使用agent_id用来区分,服务共接收到18个请求,分别在26237和5635上各处理了9个请求,这就是负载均衡。
Inspector展示的就相对比较多了,不但有服务的信息,还有服务所耗时的CPU,Memory,以及连接mysql的信息等,如下图:
这里展示的是服务的信息,和服务所消耗的资源信息。下面看一下mysql的信息:
引用: