Pinpoint

0.0 前言

国内的APM行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的APM企业,例如APPdynamic,Dynamic,NewRelic等。

我们这里不考虑商业化的实现方案,如何能够提供一种免费的开源实现方案呢?

下面给大家介绍一个开源的 APM (Application Performance Management/应用性能管理)工具 - Pinpoint。一个分布式事务跟踪系统的平台,思路基于google Dapper,用于基于java的大规模分布式系统,通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。Pinpoint的目标就是为n(n>=1)层架构开发新的跟踪平台,为n层架构的系统提供解决方案。

0.1 Pinpoint的特点如下:

  • 分布式事务跟踪,跟踪跨分布式应用的消息
  • 自动检测应用拓扑,帮助你搞清楚应用的架构
  • 水平扩展以便支持大规模服务器集群
  • 提供代码级别的可见性以便轻松定位失败点和瓶颈
  • 使用字节码增强技术,添加新功能而无需修改代码
  • 安装探针不需要修改哪怕一行代码及trace server端部署简单,支持hdfs存储
  • 具有简单的阀值触发报警功能
  • 移植性比较强的,会比较讨人喜欢(相比cat)
  • 插件化功能可扩展(https://github.com/naver/pinpoint/wiki/Pinpoint-Plugin-Developer-Guide)

0.2 Pinpoint 架构

pp-architecture

1.0 环境准备

为了省事可以直接就到这里(https://get.k8scn.org/packages/others/pinpoint/)下载所需安装包,统一放置在 /root/pp/目录下面。

apache-tomcat-8.0.36.tar.gz
hbase-1.0.3-bin.tar.gz
jdk-8u92-linux-x64.rpm
pinpoint-agent-1.5.2.tar.gz
pinpoint-collector-1.5.2.war
pinpoint-web-1.5.2.war
pp-collector
pp-web
zookeeper-3.4.6-10.el6.x86_64.rpm

1.1 部署环境约定

192.168.56.11    CentOS6(jdk1.8.0)    Pinpoint-collector, Pinpoint-web, zookeeper    # 下面我们将简称pp-collector&pp-web 
192.168.56.12    CentOS6(jdk1.8.0)    Hbase
192.168.56.13    CentOS6(jdk1.8.0)    Pinpoint-agent(demo应用)

1.2 系统环境说明

$ /etc/init.d/iptables stop
$ setenforce 0

这里我们为了不影响模块之间的相互通信,暂时先把几台设备的iptables都关闭了。

2.0 开始部署 我们采用rpm方式安装jdk,这里就略过安装过程了,主要说一下Tomcat 和Bbase的安装和配置

2.1 部署和初始化 Hbase

$ vim ~/.bashrc
# Java Environment Variables
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin

$ source ~/.bashrc
$ tar xf /root/pp/hbase-1.0.3-bin.tar.gz /usr/local/
$ cd /usr/local/hbase-1.0.3/conf
$ vim hbase-env.sh
export JAVA_HOME=/usr/java/default/     # 指到自己对应的JAVA_HOME,默认使用java6
$ vim hbase-site.xml 
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///data/hbase</value>        # 这里我们指定Hbase本地来存储数据,生产环境将数据建议存入HDFS中。
 </property>
</configuration>

$ ../bin/start-hbase.sh        // 启动 Hbase

注意: 这里说明一下,我们是最简方式启动的Hbase,没有单独部署Hbase集群管理的zookeeper,而是直接使用Hbase自带的zk模块。另外,Hbase墙裂建议将数据存入HDFS里面,目前我们是存在Hbase本地的。

2.1.1 验证Hbase是否启动成功

$ jps
8114 Jps
7820 HMaster

2.1.2下载并执行pp的Hbase初始化表语句

$ wget -c https://raw.githubusercontent.com/naver/pinpoint/master/hbase/scripts/hbase-create.hbase -P /root/pp/
$ cd /usr/local/hbase-1.0.3
$ ./bin/hbase shell /root/pp/hbase-create.hbase      #  这里需要大概半分钟时间完成pp的表初始化
$ ./bin/hbase shell
2016-07-14 20:57:10,606 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.3, rf1e1312f9790a7c40f6a4b5a1bab2ea1dd559890, Tue Jan 19 19:26:53 PST 2016
hbase(main):001:0> status 'detailed'       # 我这里已经初始化pp相关表,所以数据展示比较多
version 1.0.3
0 regionsInTransition
master coprocessors: []
1 live servers
    c612:46781 1468494831781
        requestsPerSecond=0.0, numberOfOnlineRegions=194, usedHeapMB=18, maxHeapMB=241, numberOfStores=322, numberOfStorefiles=3, storefileUncompressedSizeMB=0, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0, readRequestsCount=9272, writeRequestsCount=385, rootIndexSizeKB=2, totalStaticIndexSizeKB=1, totalStaticBloomSizeKB=0, totalCompactingKVs=0, currentCompactedKVs=0, compactionProgressPct=NaN, coprocessors=[MultiRowMutationEndpoint]
        "AgentEvent,,1468495003477.b13eb3203210fb9d94feb1a445e0ad1b."
            numberOfStores=1, numberOfStorefiles=0, storefileUncompressedSizeMB=0, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0, readRequestsCount=0, writeRequestsCount=0, rootIndexSizeKB=0, totalStaticIndexSizeKB=0, totalStaticBloomSizeKB=0, totalCompactingKVs=0, currentCompactedKVs=0, compactionProgressPct=NaN, completeSequenceId=-1, dataLocality=0.0
        "AgentInfo,,1468494998919.fa9d36f7b52b95ee5216a1ec757ad690."
...

我们同时可以登录Hbase Web管理控制台来验证相关数据 http://192.168.56.12:16010/master-status

2.2 部署和配置pp-collector和pp-web

2.2.1 这里我们还需要部署一个zookeeper。从pinpoint1.5.0开始,pp-web到pp-agent的request请求直接通过pp-collector来统筹管理,包括一些real-time级别的信息监测,而zookeeper在其中间协调三者之间的通信沟通。如果zookeeper部署在独立的一台设备,这里我就需要修改一下pp-colletor & pp-web的配置文件pinpoint-collector.properties,pinpoint-web.properties,不然会导致俩个模块启动失败。详细描述参见官方文档

$ rpm -ivh /root/pp/zookeeper-3.4.6-10.el6.x86_64.rpm
$ /etc/init.d/zookeeper start     # 保证zookeeper的2181端口起来就可以了

2.2.2 pp-collector的配置

$ mkdir -p /data/service/
$ tar xf /root/pp/apache-tomcat-8.0.35.tar.gz -C /data/service/;cd /data/service/
$ mv apache-tomcat-8.0.35/ pinpoint-collector
$ vim /data/service/pinpoint-collector/conf/server.xml       # 因为我们的pp-collector和pp-web部署在同台设备,所以请确认tomcat启动端口不会冲突
<Server port="8005" shutdown="SHUTDOWN">      
<Connector port="8085" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->     #  注释该行

$ rm -rf /data/service/pinpoint-collector/webapps/*
$ unzip pinpoint-collector-1.5.2.war -d /data/service/pinpoint-collector/webapps/ROOT/
$ cd  /data/service/pinpoint-collector/webapps/ROOT/WEB-INF/classes
$ ls -al
-rw-rw-r-- 1 root root 15835 Apr  7 14:43 applicationContext-collector.xml
-rw-rw-r-- 1 root root  7485 Apr  7 14:43 applicationContext-hbase.xml
-rw-rw-r-- 1 root root   757 Apr  7 14:43 hbase.properties     
-rw-rw-r-- 1 root root  1845 Apr  7 14:43 log4j.xml
-rw-rw-r-- 1 root root  1360 Apr  7 14:43 pinpoint-collector.properties     # 主要针对pp-agent的配置,同时支持tcp和udp协议数据传输
-rw-rw-r-- 1 root root  3292 Apr  7 14:43 servlet-context.xml
...

这里大概说一下: applicationContext-collector.xml, applicationContext-hbase.xml 这俩个配置文件时collector与agent和Hbase之间通信时需要设定的一些参数,在后续调优的时候需要用到,hbase.properties 主要是设定后端存储的连接配置,log4j.xml那就是log相关了。

$ vim hbase.properties
hbase.client.host=192.168.56.12        # 这里我们只修改这一项配置就好,能够让collector将汇报上来的数据存储到Hbase
hbase.client.port=2181

这里tomcat我们就用默认的启动端口了,实际的生产环境可能需要根据实际情况修改tomcat侦听端口。OK,到此,pp-collector我们就基本上配置完成了。接下来我们开始配置pp-web,它与collector很类似。

2.2.3 pp-web的配置

$ cd /data/service/
$ tar xf /root/pp/apache-tomcat-8.0.35.tar.gz -C /data/service/
$ mv apache-tomcat-8.0.35 pinpoint-web
$ cd pinpoint-web/webapps/;rm -rf *;mkdir ROOT;cd ROOT/
$ unzip /root/pinpoint-web-1.5.2.war
$ vim /data/service/pinpoint-web/conf/server.xml       # 因为我们的pp-collector和pp-web部署在同台设备,所以请确认tomcat启动端口不会冲突
<Server port="8006" shutdown="SHUTDOWN">      
<Connector port="8086" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->     #  注释该行

$ cd /data/service/pinpoint-web/webapps/ROOT/WEB-INF/classes
$ vim hbase.properties
hbase.client.host=192.168.56.12    # 设置Hbase数据源
hbase.client.port=2181
...
$ ls -al
total 88
-rw-rw-r-- 1 root root 2164 Apr  7 14:43 applicationContext-cache.xml
-rw-rw-r-- 1 root root 3649 Apr  7 14:43 applicationContext-dao-config.xml
-rw-rw-r-- 1 root root 1490 Apr  7 14:43 applicationContext-datasource.xml
-rw-rw-r-- 1 root root 6680 Apr  7 14:43 applicationContext-hbase.xml
-rw-rw-r-- 1 root root 1610 Apr  7 14:43 applicationContext-websocket.xml
-rw-rw-r-- 1 root root 6576 Apr  7 14:43 applicationContext-web.xml
-rw-rw-r-- 1 root root  106 Apr  7 14:43 batch.properties
-rw-rw-r-- 1 root root  682 Apr  7 14:43 ehcache.xml
-rw-rw-r-- 1 root root 1005 Jul 14 21:45 hbase.properties
-rw-rw-r-- 1 root root  153 Apr  7 14:43 jdbc.properties
-rw-rw-r-- 1 root root 3338 Apr  7 14:43 log4j.xml
-rw-rw-r-- 1 root root 1420 Apr  7 14:43 mybatis-config.xml
-rw-rw-r-- 1 root root  630 Apr  7 14:43 pinpoint-web.properties
-rw-rw-r-- 1 root root  141 Apr  7 14:43 project.properties
-rw-rw-r-- 1 root root 3872 Apr714:43 servlet-context.xml
drwxrwxr-x 2 root root 4096Jul1421:46 sql
...

这里说明一下:

  • hbase.properties 配置我们pp-web从哪个数据源获取采集数据,这里我们只指定Hbase的zookeeper地址。
  • jdbc.properties pp-web连接自身Mysql数据库的连接认证配置。
  • sql目录 pp-web本身有些数据需要存放在MySQL数据库中,这里需要初始化一下表结构。
  • pinpoint-web.properties 这里pp-web集群的配置文件,如果你需要pp-web集群的话。
  • applicationContext-*.xml 这些文件在后续的调优工作中会用到。
  • log4j.xml 日志相关配置。

好了,pp-web终于算是配置完成了。

2.3 到这里,我们就可以启动pp-colletor和pp-web了

$ cp /root/pp/pp-* /etc/init.d/
$ chmod +x /etc/init.d/pp-*
$ /etc/init.d/pp-web restart
$ /etc/init.d/pp-collector restart

3.0 我们这个时候可以部署一个pp-agent试玩一下了,其实也就是很多APM厂商传说中的探针。这里我的探针是部署在自己的应用下面的,就只贴一下跑在tomcat下的探针配置信息了。顺带说明一下部署上的注意点。

以下是pp目前支持埋点的java模块:

JDK 6+
Tomcat 6/7/8, Jetty 8/9
Spring, Spring Boot
Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient
Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER
MySQL, Oracle, MSSQL, CUBRID, DBCP, POSTGRESQL, MARIA
Arcus, Memcached, Redis, CASSANDRA
iBATIS, MyBatis
gson, Jackson, Json Lib
log4j, Logback

3.1 部署pp-agent (探针)

我们约定tomcat容器安装位置 /data/projects/service/app_demo,这里我们就将pp-agent解压至 /data/projects/service/下。

$ tar xf /root/pp/pinpoint-agent-1.5.2.tar.gz -C /data/projects/service/
$ cd /data/projects/service/pinpoint-agent-1.5.2/
$ vim pinpoint.config
profiler.collector.ip=192.168.56.11

这里说明一下: 我们只要指定pp-colletor的地址就可以了,至于端口如果之前pp-colletor没有变更这里也不需要修改。如果你的生产环境特殊,pinpoint支持还是很丰富的,同时支持tcp和udp协议传输。

$ pwd
/data/projects/service/pinpoint-agent-1.5.2
$ ls -al
total 80
drwxrwxr-x 6 ceph ceph  4096 Jul 14 22:11 .
drwxr-xr-x 3 root root  4096 Jul 14 22:08 ..
drwxrwxr-x 2 ceph ceph  4096 Apr  7 13:43 boot
drwxrwxr-x 2 ceph ceph  4096 Apr  7 13:43 lib
-rw-rw-r-- 1 ceph ceph 27603 Apr  7 13:42 pinpoint-bootstrap-1.5.2.jar
-rw-rw-r-- 1 ceph ceph 14278 Apr  7 13:30 pinpoint.config
-rw-rw-r-- 1 ceph ceph 11988 Apr  7 13:30 pinpoint-real-env-lowoverhead-sample.config
drwxrwxr-x 2 ceph ceph  4096 Apr  7 13:43 plugin
drwxrwxr-x 2 ceph ceph  4096 Apr  7 13:43 script

此刻,我们开始往我们的应用里部署探针。

$ vim /data/projects/service/app_demo/bin/catalina.sh
AGENT_VERSION="1.5.2"
AGENT_ID="pp201606011442"
APPLICATION_NAME="app-192-168-56-13"
AGENT_PATH="/data/projects/service/pinpoint-agent-1.5.2"
CATALINA_OPTS="$CATALINA_OPTS -javaagent:$AGENT_PATH/pinpoint-bootstrap-${AGENT_VERSION}.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=$AGENT_ID"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=$APPLICATION_NAME"

这里说明一下:

  • 探针配置项写到 CATALINA_OPTS 变量下一行即可。
  • AGENT_ID 命名必须在生产环境里唯一,否则后面将会混乱。
  • APPLICATION_NAME 配置为一个服务组的ID号,即服务组下的实例ID。
  • 此外参考官方agent文档说明

4.0. 重启被采集端的应用,使探针生效。

5.0. 打开浏览器,访问如下pp-web的页面验证我们的探针部署是否成功。其中,第二个链接是pp的APM主页面可以看到探针汇报上来的信息了。

http://192.168.56.11:8086/stat.html      # pp-agent 信息统计页面,即探针部署情况的统计信息 
http://192.168.56.11:8086/#/main       # pp APM信息主页面

5.1 页面访问效果如下(没有找到一个好的demo应用,这部分后续补齐,所以页面没有信息采集上来):

Pinpoint AgentPinpoint Main

6.0. 问题排查

  • 看日志,看日志,看日志。
  • 部署成功调试完成最好把agent端log级别调高一些,少打印日志。讲真,不然在你实时查看日志定位程序问题时,你会发现打印一堆了无效信息,绝对懵B。

7.0. 最后这里我们讲一下如何制作自己的Pinpoint定制版war包

7.1 编译环境要求

maven:3.2+
jdk-6/7/8

7.2 获取pp源代码

$ git clone https://github.com/naver/pinpoint.git
$ git branch -a 
* master
  remotes/origin/1.0.x
  remotes/origin/1.1.x
  remotes/origin/1.5.0-branch
  remotes/origin/1.5.x
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git checkout 1.5.x     // pp v1.6.x属于活跃开发版不建议编译安装,除非你非常熟悉pp的代码

7.3 设置JAVA环境变量为JDK-1.8.0。这里小小解释一下: 因为pp同时支持java多版本,这也是pp最可爱的地方,所以我们需要设置一下。

$ export JAVA_6_HOME=/usr/java/default
$ export JAVA_7_HOME=/usr/java/default
$ export JAVA_8_HOME=/usr/java/default
$ export JAVA_HOME=/usr/java/default

7.4 开始war包制作

$ cd pinpoint
$ mvn -f ./pom.xml install -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] pinpoint
[INFO] pinpoint-thrift
[INFO] pinpoint-commons
[INFO] pinpoint-commons-hbase
[INFO] pinpoint-commons-server
[INFO] pinpoint-bootstrap-core
[INFO] pinpoint-bootstrap
[INFO] pinpoint-rpc
[INFO] pinpoint-profiler
...

编译过程可能有些长,尤其在国内的网络环境。结束以后,请到target目录获取相应的pp war包。

7.5 编译过程遇到的问题:

[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-pinpoint-build-requirements) @ pinpoint ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireMavenVersion failed with message:
Detected Maven Version: 3.0.5 is not in the allowed range 3.2.
[INFO] ---------------------------------------------------------

问题解决:升级的maven版本,需要至少3.2+以上。

好了,今天先写到这,欢迎大家加群讨论(Pinpoint中文社区QQ群563655806)。

参考文档:

https://github.com/naver/pinpoint/blob/master/doc/installation.md
http://hbase.apache.org/book.html#standalone_dist Apache HBase ™ Reference Guide

原文地址:https://www.cnblogs.com/onetwo/p/6432686.html