Pinpoint - 应用性能管理(APM)平台实践之部署篇
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 架构

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应用,这部分后续补齐,所以页面没有信息采集上来):


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
Pinpoint - 应用性能管理(APM)平台实践之部署篇的更多相关文章
- 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint
目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...
- 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking
目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...
- 第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置
第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置 软件版本 uwsgi- ...
- 第四百零一节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署virtualenv虚拟环境安装,与Python虚拟环境批量安装模块
第四百零一节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署virtualenv虚拟环境安装,与Python虚拟环境批量安装模块 virtualenv简介 1.安装virtuale ...
- 第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1
第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1 1.检查系统是否安装了python [root@192 ~]# rpm -qa ...
- 第三百九十九节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装mysql5.6
第三百九十九节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装mysql5.6 1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步 ...
- 第三百九十八节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5系统环境设置
第三百九十八节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5系统环境设置 1.Linux安装配置 注意事项: 虚拟机网卡桥接模式 不要拨VPN 如果,网络怎么都 ...
- 使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry
这篇文章将介绍如何使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry.本文的目的在于: 了解作为 PaaS 的 Cloud Foundr ...
- XXL-JOB分布式任务调度平台安装与部署
配XXL-JOB分布式任务调度平台安装与部署
随机推荐
- 用SLF4j/Logback打印日志-3
在 用SLF4j/Logback打印日志-1 和 用SLF4j/Logback打印日志-2 中分别介绍了Logback记录日志的基本原理并重点介绍了输出源配置.本篇介绍一些性能和技巧性的东西. 性能 ...
- Downloading files from a server to client, using ASP.Net, when file size is too big for MemoryStream using Generic Handlers (ashx)
Currently, I was trying to write an ASP.Net application that involved a user clicking a ASP.Net butt ...
- [leetcode]Combinations @ Python
原题地址:https://oj.leetcode.com/problems/combinations/ 题意:组合求解问题. 解题思路:这种求组合的问题,需要使用dfs来解决. 代码: class S ...
- iOS开发-UIActivityIndicatorView简单使用
软件开发的时候经常会遇到半天才加载出来数据的情况,不管是程序写的烂,还是说本来网速比较慢,一般都都会给个提示让用户感觉到我们在努力的加载数据,iOS可以通过UIActivityIndicatorVie ...
- JavaScript中textRange对象使用方法总结
TextRange对象是动态HTML(DHTML)的高级特性,使用它可以实现很多和文本有关的任务,例如搜索和选择文本.文本范围让您可以选择性的将字符.单词和句子从文档中挑选出来.TextRange对象 ...
- Android studio安装配置常见问题及其解决方案
Android studio 是目前android公司主推的一款开发工具,相比较以前eclipse,它自己内部就集成了SDK等,方便开发.这几天我也尝试从官网下载了一个android studio进行 ...
- Neo4j 查询某标签节点个数语句 删除某标签全部节点语句
查询:MATCH (n:标签名) RETURN count(n) 删除:MATCH (n:标签名) DELETE n
- 启动项目时出现Not a JAR.......Find JAR........一指循环就是起不来
出现问题原因就是mapper的映射文件有问题,里面的返回类型如是实体找不到或者找重复的就会这样 解决办法就是:确保在用的实体(路径)能找到,切记不能有重名的实体
- Android权限判断checkPermission
判断本程序是否拥有某权限的方法: private static final String EXTERNAL_STORAGE_PERMISSION = "android.permission. ...
- Bridging and Bonding with CentOS 6.5
eth0和eth1要做bond,然后kvm虚拟机通过bridge与外界通信. 那么就要在bond上做bridge.配置文件例如以下,实測这样配置,能够从kvm虚拟机ping通外界拓扑. ifcfg-e ...