Pinpoint - 应用性能管理(APM)平台实践之部署篇

0.0 前言html

国内的APM行业这两年刚刚起步,可是在国外却比较成熟了,而且因为这两年人力成本的快速提升,国内外涌现了几家很是不错的APM企业,例如APPdynamic,Dynamic,NewRelic等。java

咱们这里不考虑商业化的实现方案,如何可以提供一种免费的开源实现方案呢?linux

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

0.1 Pinpoint的特色以下:github

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

0.2 Pinpoint 架构web

pp-architecture

1.0 环境准备sql

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

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 系统环境说明apache

$ /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.mdhttp://hbase.apache.org/book.html#standalone_dist Apache HBase ™ Reference Guide

相关文章
相关标签/搜索