分布式服务调用链路追踪——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才可以。

解决方法:

  1. 因为打包的时候要依赖java1.6(建议使用1.6.0_45)、java1.7(建议使用1.7.0_80)、java1.8(建议使用jdk1.8.0_191)、java1.9(建议使用9.0.4)环境,所以这几个版本的java都需要安装及配置环境变量;
  2. 安装及配置maven,版本这里建议使用3.5.x版本(本文使用3.5.4),使用3.6.1版本编译会报错;
  3. 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}
  4. 官网github下载pinpoint-2.2.2.tar.gz并解压;
  5. 修改源码中的pom.xml,把hbase.shaded.client.version值改成hbase的版本2.0.0
  6. 进入源码的根目录,执行以下命令进行编译:

  7. ./mvnw clean install -P hbase2,release -DskipTests=true
  8. 编译成功后,进入源码的以下目录,获取相关包:
  9. ../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 建表文件
  10. 检查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. 功能介绍

图片标注注释:

  1. 项目名称(可以上下拉动选择不同项目)
  2. 入站和出站(可以根据不同出入数生成不同的map图)
  3. 时间选择,左至右顺序,日历,5秒,20秒,1小时,3小时,6小时,12小时,1天,2天
  4. 根据2生成的链路图,相关联的程序之间的走向
  5. 动态实时走势图,一个请求算是一个点,红点是请求失败,y轴表示请求时间
  6. 程序资源使用情况,包括使用的cpu,内存,mysql的并发等。
  7. 根据请求时间对数量进行统计(一段时间内,请求耗时1秒钟的数量,3秒钟的数量,5秒钟的数量,慢请求,错误)
  8. 一段时间的请求使用柱状图展示,下面的颜色进行区分

特别注意事项5:

上图5中是请求的url统计,可以使用鼠标右键选择部分请求,松开鼠标跳到下面这个页面

 

标注注释:

1、是请求的url,所在服务器的IP,pinpoint客户端定义的server名称以及时间。  如果有错误的请求,在Exception栏有一个pinpoint使用说明标志

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的信息:

 

 

引用:

posted on 2021-05-22 18:34  曹伟雄  阅读(6350)  评论(0编辑  收藏  举报

导航