应用性能管理工具PinPoint介绍

来源:互联网 发布:数据透视表实时更新 编辑:程序博客网 时间:2024/06/07 20:46

概述

下面给大家介绍一个开源的 APM (Application Performance Management/应用性能管理)工具 - Pinpoint。一个分布式事务跟踪系统的平台,思路基于google Dapper,用于基于java的大规模分布式系统,通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。Pinpoint的目标就是为n(n>=1)层架构开发新的跟踪平台,为n层架构的系统提供解决方案。pinpoint 有3个主要组件组成:日志收集器[Collector]、控制台[Web]、代理[Agent],采用HBase进行存储。 Collector和Web都是WAR包,Agent采用一个JAVA应用程序加载。

Pinpoint的特点如下:

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

    平台的架构图如下:


  • 环境准备

    apache-tomcat-8.0.36.tar.gzhbase-1.0.3-bin.tar.gzjdk-7u79-linux-x64.tar.gzpinpoint-agent-1.5.2.tar.gzpinpoint-collector-1.5.2.warpinpoint-web-1.5.2.warzookeeper-3.4.6-10.el6.x86_64.rpm以上软件地址10.21.10.77  路径/home/cib/software(绝对路径) 用户名/密码 cib/cib123456

    部署环境约定

    192.168.56.11    CentOS6(jdk1.7.0)    Pinpoint-collector, Pinpoint-web, zookeeper    #下面我们将简称pp-collector&pp-web192.168.56.12    CentOS6(jdk1.7.0)    Hbase192.168.56.13    CentOS6(jdk1.7.0)    Pinpoint-agent(demo应用)以上服务器地址也可以部署在同一台服务器上 我的都是安装在10.21.10.77上的

    系统环境说明

    查看服务器上面1.0安装的软件是否已经安装了和相关的服务是否是开启的 如果有开启的服务 先暂停服务

    开始部署

    jdk安装

    我这里的jdk安装的方式是用tar.zp的方式 安装请用root用户 切换到root用户sudo su - 解压jdk,解压命令:tar -xvzf /home/java/jdk-7u25-linux-x64.tar.gz设置环境变量 vi ~/.bashrcexport JAVA_HOME=/home/java/jdk/jdk1.7.0_69export JAVA_BIN=$JAVA_HOME/binexport JAVA_LIB=$JAVA_HOME/libexport CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jarexport PATH=$JAVA_BIN:$PATH刷新环境变量设计source ~/.bashrc查看jdk版本java -version 如果有版本号信息 表示安装成功

    安装 HBase

    部署和初始化 Hbase

    pinpoint存储依赖于hbase,hbase的分布式文件存储系统依赖于hadoop,因此如果hbase需要要使用hdfs存储数据,就需要安装hadoop,但是hbase如果使用普通的文件系统存储数据,就不需要安装hadoop。

    下图为pinpoint版本和Hbase的关系:

    Pinpoint Version   HBase 0.94.xHBase 0.98.x   HBase 1.0.x   HBase 1.1.x    1.0.x      yes      no    no          no    1.1.x      no not tested   yes     not tested    1.5.x      no not tested   yes     not tested

    hbase 安装

    解压hbase-1.0.3-bin.tar.gz$ tar xf /root/pp/hbase-1.0.3-bin.tar.gz /usr/local/$ cd /usr/local/hbase-1.0.3/conf修改/usr/local/hbase-1.0.3/conf/hbase-env.sh$ vim hbase-env.shexport JAVA_HOME=/home/java/jdk/jdk1.7.0_69     # 指到自己对应的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本地的。

    验证Hbase是否启动成功

    $ jps8114 Jps7820 HMaster

    下载并执行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 shell2016-07-14 20:57:10,606 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicableHBase Shell; enter 'help<RETURN>' for list of supported commands.Type "exit<RETURN>" to leave the HBase ShellVersion 1.0.3, rf1e1312f9790a7c40f6a4b5a1bab2ea1dd559890, Tue Jan 19 19:26:53 PST 2016hbase(main):001:0> status 'detailed'       # 我这里已经初始化pp相关表,所以数据展示比较多version 1.0.30 regionsInTransitionmaster coprocessors: []1 live serversc612: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脚本介绍

  • hbase-create.hbase - 创建pinpoint必须的表。
  • hbase-drop.hbase - 删除pinpoint必须的所有表
  • hbase-flush-table.hbase - 刷新所有表
  • hbase-major-compact-htable.hbase- 压缩主要的所有表

    我们同时可以登录Hbase Web管理控制台来验证相关数据 http://192.168.56.12:16010/master-status 这个地址是指你自己安装的地址

    安装 Pinpoint-collector

    安装pp-collector的jdk条件:

    系统已安装JDK 6、JDK 7+ 、Maven 3.2.x+ ;并设置环境变量:JAVA_6_HOME和JAVA_7_HOME.下图为JDK版本与Pinpoint版本关系:

    Pinpoint Agent Collector  Web1.0.x   6+   6+         6+1.1.x   6+   7+         7+1.5.x   6+   7+         7+

    pp-collector的安装与配置

    #创建/data/service/目录$ mkdir -p /data/service/#解压你的tomcat致 /data/service 这个路径你可以解压到自己创建的目录$ tar xf /root/pp/apache-tomcat-8.0.35.tar.gz -C /data/service/$ cd /data/service/#将apache-tomcat-8.0.35移动到pinpoint-collector文件中$ mv apache-tomcat-8.0.35/ pinpoint-collector#更改pinpoint-collector tomcat的server.xml$ vim /data/service/pinpoint-collector/conf/server.xml       # 因为我们的pp-collector和pp-web部署在同台设备,所以请确认tomcat启动端口不会冲突#如果在同一个服务器启用多个tomcat 请更改下面server的port端口 当然你也可以用别的方式<Server port="8005" shutdown="SHUTDOWN">     #设置pinpoint-collector tomcat的端口<Connector port="8085" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->     #  注释该行#pinpoint-collector-1.5.2.war部署到webapps 并命名为ROOT$ 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.propertieshbase.client.host=192.168.56.12        # 这里我们只修改这一项配置就好,能够让collector将汇报上来的数据存储到Hbase 如果你是在同一台机器上安装的hbase就没必要改了 因为默认就是localhosthbase.client.port=2181

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

    安装 Pinpoint-web

    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#更改pinpoint-collector tomcat的server.xml$ vim /data/service/pinpoint-web/conf/server.xml       # 因为我们的pp-collector和pp-web部署在同台设备,所以请确认tomcat启动端口不会冲突#如果在同一个服务器启用多个tomcat 请更改下面server的port端口 当然你也可以用别的方式<Server port="8006" shutdown="SHUTDOWN">     #设置pinpoint-collector tomcat的端口<Connector port="8086" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->     #  注释该行#pinpoint-collector-1.5.2.war部署到webapps 并命名为ROOT$ rm -rf /data/service/pinpoint-web/webapps/*$ unzip pinpoint-web-1.5.2.war -d /data/service/pinpoint-web/webapps/ROOT/$ cd  /data/service/pinpoint-web/webapps/ROOT/WEB-INF/classes   $ ls -altotal 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 Apr  7 14:43 servlet-context.xmldrwxrwxr-x 2 root root 4096 Jul 14 21:46 sql $ vim hbase.propertieshbase.client.host=192.168.56.12    # 设置Hbase数据源hbase.client.port=2181... 

    配置解说

    //pinpoint-web.properties --web参数配置如下:cluster.enable=truecluster.web.tcp.port=9997cluster.zookeeper.address=localhostcluster.zookeeper.sessiontimeout=30000cluster.zookeeper.retry.interval=60000cluster.connect.address=//hbase.properties        -- 配置连接hbase参数如下:hbase.client.host (default: localhost)hbase.client.port (default: 2181)//hbase数据库和mysql数据库选择一项配置,如果配置了hbase数据库,此项不用配置,仅当选用mysql数据库时配置//jdbc.properties         -- 配置连接mysql数据库如下:jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:13306/pinpoint?characterEncoding=UTF-8jdbc.username=adminjdbc.password=admin//hbase数据库和mysql数据库选择一项配置,如果配置了hbase数据库,此项不用配置,仅当选用mysql数据库时配置//创建pinpoint数据库并创建表 mysql命令行下执行命令如下:create DATABASE if not exists pinpoint DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;use pinpoint\. sql/CreateTableStatement-mysql.sql\. sql/SpringBatchJobReositorySchema-mysql.sqlcommit;

    注:zookeeper和pp-collector、pp-web不在同一台服务器上时的配置

    从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端口起来就可以了修改pinpoint-collector.propertiesvi /data/service/pinpoint-collector/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties# enable cluster in socket manager.cluster.enable=truecluster.zookeeper.address=localhost            #如果zk单独配置, 需要修改此项cluster.zookeeper.sessiontimeout=30000cluster.listen.ip=cluster.listen.port= 修改pinpoint-web.propertiesvi /data/service/pinpoint-web/webapps/ROOT/WEB-INF/classes/pinpoint-web.properties  # -------------------------------------------------------------------------------------------------# The cluster related options are used to establish connections between the agent, collector, and web in order to send/receive data between them in real time.# You may enable additional features using this option (Ex : RealTime Active Thread Chart).# -------------------------------------------------------------------------------------------------# Usage : Set the following options for collector/web components that reside in the same cluster in order to enable this feature.# 1. cluster.enable (pinpoint-web.properties, pinpoint-collector.properties) - "true" to enable# 2. cluster.zookeeper.address (pinpoint-web.properties, pinpoint-collector.properties) - address of the ZooKeeper instance that will be used to manage the cluster# 3. cluster.web.tcp.port (pinpoint-web.properties) - any available port number (used to establish connection between web and collector)# -------------------------------------------------------------------------------------------------# Please be aware of the following:#1. If the network between web, collector, and the agents are not stable, it is advisable not to use this feature.#2. We recommend using the cluster.web.tcp.port option. However, in cases where the collector is unable to establish connection to the web, you may reverse this and make the web establish connection to the collector.#   In this case, you must set cluster.connect.address (pinpoint-web.properties); and cluster.listen.ip, cluster.listen.port (pinpoint-collector.properties) accordingly.cluster.enable=truecluster.web.tcp.port=9997cluster.zookeeper.address=localhostcluster.zookeeper.sessiontimeout=30000cluster.zookeeper.retry.interval=60000cluster.connect.address=注意:以上配置文件需要修改 是因为zookeeper单独部署

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

    启动的方式有很多 我是用比较笨的方式进去pinpoint-colletor 和pinpoint-web 的bin目录下执行start.sh启动的

    安装 Pinpoint-agent

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

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

    JDK 6+Tomcat 6/7/8, Jetty 8/9Spring, Spring BootApache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClientThrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMERMySQL, Oracle, MSSQL, CUBRID, DBCP, POSTGRESQL, MARIAArcus, Memcached, Redis, CASSANDRAiBATIS, MyBatisgson, Jackson, Json Liblog4j, Logback

    部署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.configprofiler.collector.ip=192.168.56.11  #这里说明一下: 我们只要指定pp-colletor的地址就可以了,至于端口如果之前pp-colletor没有变更这里也不需要修改。如果你的生产环境特殊,pinpoint支持还是很丰富的,同时支持tcp和udp协议传输。 默认是localhost 

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

    $ vim /data/projects/service/app_demo/bin/catalina.shAGENT_VERSION="1.5.1"AGENT_ID="pp201606011442"APPLICATION_NAME="app-192-168-56-13"AGENT_PATH="/data/projects/service/pinpoint-agent-1.5.1"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文档说明

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

    Pinpoint安装完成

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

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

    Pinpoint源码下载

  • 下载pinpoint源码

    制作自己的Pinpoint定制版war包 编译环境要求

    maven:3.2+jdk-6/7/8

    解压master.zip,然后执行命令: maven命令

    mvn install -Dmaven.test.skip=true


  • 转载路径:http://blog.csdn.net/mingyu1016/article/details/53925611
  • 相关资料:http://blog.csdn.net/u013793732/article/details/63684929

  • -----------------------使用心得------------------------------
  • 1.pp-web 去除无用的应用名:
  • 下载pinpoint源码可以,找到pinpoint-web 模块,包路径为:com.navercorp.pinpoint.web.controller下的AdminController类,可以看到其中有个方法是removeApplicationName,只需要调用这个方法,传入参数就能删除没用的应用。使用方式如下:
  • http://ip/admin/removeApplicationName.pinpoint?applicationName=admin-dev&password=admin

  • 2.pinpoint-web显示不了agent的信息
  • 原因是可能是要给服务所在的服务器进行host配置。比如:

    agent服务器的hostname叫agent01,那就要在/etc/hosts里声明:agent01 127.0.0.1

    其它服务同理,都要做这个配置才行。


  • ----------------------2017年12月6日10:42:09-----------------------

  • 问题:今天pinpoint接收不到数据,pp-web疯狂报错zookeeper(用的hbase自带的),发现hbase挂掉了,

  • 使用命令:

  • ./start-hbase.sh

  • 报错信息:

  • OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
    OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0

  • 解决办法

  • cd hbase/conf

  • vim hbase-env.sh

  • 注释掉以下:

  • # Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
    export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

    export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"


  • 之后再次启动,成功。

  • 原创粉丝点击