分布式跟踪工具Pinpoint技术入门

本文初衷

因为工作需要,这周研究了一下APM(Application Performance Management)相关技术,看了些许资料,对比了各种技术的特点,最终选择Pinpoint作为性能监控工具,本文的主要目的是记录本人部署Pinpoint的过程。

Pinpoint是什么

简单的说,Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统分布式跟踪系统。我们知道,前端向后台发起一个查询请求,后台服务可能要调用多个服务,每个服务可能又会调用其它服务,最终将结果返回,汇总到页面上。如果某个环节发生异常,工程师很难准确定位这个问题到底是由哪个服务调用造成的,Pinpoint等相关工具的作用就是追踪每个请求的完整调用链路,收集调用链路上每个服务的性能数据,方便工程师能够快速定位问题。

同类工具

为什么要用Pinpoint

最重要的原因,对代码的零侵入,运用JavaAgent字节码增强技术,只需要加启动参数即可。

Pinpoint架构图

pinpoint-architecture

(图片出处:官网)架构说明:

  • Pinpoint-Collector:收集各种性能数据
  • Pinpoint-Agent:和自己运行的应用关联起来的探针
  • Pinpoint-Web:将收集到的数据显示成WEB网页形式
  • HBase Storage:收集到的数据存到HBase中

开始部署

前提条件

  • maven 3.2.x+
  • git
  • java 6+

0. 开始

1. 部署Hbase

Pinpoint以Hbase作为数据的存储。

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
  • 编辑hbase-site.xml:
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>file:///Users/acheron/Tmp/hbase</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/Users/acheron/Tmp/zookeeper</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2182</value>
  </property>
</configuration>

这样配置是本地单实例模式启动,上面配置分别表示:数据存放地点、zookeeper数据存放地点、zookeeper端口号(默认2181)。当然这个文件可以不配置,那么会采取默认值

启动hbase的时候,hbase用得是自带的zk,在hbase的配置里可见 export HBASE_MANAGES_ZK=true;

  • 进入hbase/bin目录启动hbase:./start-hbase.sh
  • jps命令查看Hbase是否启动成功,如果启动成功的会看到”HMaster”的进程
  • 初始化pinpoint需要的表:./hbase shell hbase-create.hbase (这里的hbase-create.hbase在源码pinpoint/hbase/scripts/hbase-create.hbase)
  • 访问页面测试是否成功:http://localhost:16010/master-status ,如果成功在页面的tables标签下能看到导入的表。
  • 也可以用命令来查看是否导入表成功,进入hbase,输入”status ‘detailed'”可以查看初始化的表
./hbase shell
status 'detailed'

2. 部署Pinpoint-collector

  • 将pinpoint-collector-1.6.0-SNAPSHOT.war放到tomcat-collector-8086/webapps/下,并重命名为ROOT.war
  • 启动tomcat,配置ROOT/WEB-INF/classes/hbase.properties:
hbase.client.host=localhost
hbase.client.port=2181

指向zookeeper的地址和端口,如果是本机,端口默认,则这里不需更改。

  • 配置上面后,重启tomcat(端口8086

3. 部署Pinpoint-web

Pinpoint-web的配置和Pinpoint-collector相似:

  • 将pinpoint-web-1.6.0-SNAPSHOT.war放到tomcat-web-8085/webapps/下,并重命名为ROOT.war
  • 启动tomcat,配置ROOT/WEB-INF/classes/hbase.properties:
hbase.client.host=localhost
hbase.client.port=2181

指向zookeeper的地址和端口,如果是本机,端口默认,则这里不需更改。

  • 配置上面后,重启tomcat(端口8085

4. 部署Pinpoint-agent

  • 新建目录:mkdir pp-agent
  • 将pinpoint-agent-1.6.0-SNAPSHOT.tar.gz 拷贝到pp-agent目录并解压
  • 配置pinpoint.config:profiler.collector.ip=127.0.0.1这是指pinpoint-collector的地址,如果是同一服务器,则不用修改。其它默认。
  • 安装pinpoint-collector启动后,自动就开启了9994,9995,9996的端口了,这里默认即可。如果有端口需求,要去pinpoint-collector的配置文件(“pinpoint-collector/webapps/ROOT/WEB-INF/classes/pinpoint-collector.properties”)中,修改这些端口。

5. 部署TestApp

  • 官方提供了一个测试用的应用,pinpoint-quickstart-testapp-null.war,将其重命名为ROOT.war,部署到tomcat-testapp-8084
  • 修改此tomat的/bin/catalina.sh,在106行左右加入启动参数:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/Users/acheron/pinpoint/pp-agent/pinpoint-bootstrap-1.6.0.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=myapp"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=MyTestPP"

第一行:pinpoint-bootstrap-1.6.0.jar的位置

第二行:这里的agentId必须唯一,标志一个jvm。

第三行:applicationName表示同一种应用:同一个应用的不同实例应该使用不同的agentId,相同的applicationName。

6. springboot包部署

如果是jar包部署,直接在启动命令加启动参数:

nohup java -javaagent:/Users/acheron/pinpoint/pp-agent/pinpoint-bootstrap-1.6.0.jar -Dpinpoint.agentId=acheron-consumer -Dpinpoint.applicationName=acheron-consumer -jar myapp.jar &

7.效果演示

hbase和各应用都启动成功之后,访问Pinpoint-web,效果:

pinpoint-page

结束语

各大APM工具,几乎都是根据google这篇经典的Dapper论文而来,一定要读一读。这里是它的源文地址:https://research.google.com/pubs/pub36356.html,感谢这位同学的翻译:http://bigbully.github.io/Dapper-translation/

参考文章

实时应用监控平台CAT安装和配置

CAT是什么

CAT是一个Java语言编写的实时监控系统,能够跟各种流行的中间件框架集成(MVC框架、RPC框架、数据库框架、缓存框架等),实现对应用各层级的系统运行状况监控。

CAT支持的监控消息类型

  • Transaction: 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。
  • Event :用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。
  • Heartbeat: 表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等。 Metric 用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。
  • Trace: 用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息

运行环境

  • Java 6 以上
  • Web 应用服务器,如:Apache Tomcat、JBoss Application Server、WebSphere Application Server、WebLogic Application Server(可选项,内置Netty应用服务器)
  • MySQL 数据库
  • Maven 3 以上(只编译和安装时需要)

开始安装

前提:已安装jdk、git、maven、mysql

  • 获取源码:
    git clone https://github.com/dianping/cat.git
    
  • 进入cat目录,执行maven构建命令
    cd cat
    clean install -Dmaven.test.skip=true
    

此处如果编译不成功,不能下载相关jar包,则可以手动下载,包在cat的mvn-repo分支下(https://github.com/dianping/cat/tree/mvn-repo) ,下载后拷贝到本地的maven仓库下

  git checkout mvn-repo
  cp -R * ~/.m2/repository
  • 将构建成功后的war包重命名,并拷贝到tomcat的webapp下
    mv cat-alpha-1.4.0.war cat.war
    cp cat.war tomcat/webapp
    
  • 启动tomcat,访问如下地址,后台默认登录catadmin/catadmin
    http://localhost:8080/cat/
    

创建数据库

  • 安装好mysql后,登录mysql,创建表空间
    create database cat;
    
  • 执行cat源码下的数据库脚本cat/script/Cat.sql,创建相关表
    use cat;
    source Cat.sql;
    

修改服务配置

  • /data/appdatas/cat/下,如果没有则新建此目录,确保这个目录有读写权限
    cd /data/appdatas/cat/
    
  • 将cat源码下script目录下的三个配置文件(client.xml、server.xml、datasources.xml)拷贝到上述目录
    cp /cat/script/*.xml /data/appdatas/cat/
    

*** 修改配置文件之前的几项假设:***

  • cat.war 包部署在10.8.40.26、10.8.40.27、10.8.40.28三台机器上,10.8.40.26为三台机器中的主服务器,TCP端口只能局域网内访问;
  • 数据库采用 MySQL安装在10.8.40.147上;
  • 暂不启用HDFS存储服务;
  • 暂不启用LDAP服务;

1. 修改客户端配置文件:client.xml

打开/data/appdatas/cat/client.xml客户端配置文件,

<config mode="client"
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xsi:noNamespaceSchemaLocation="config.xsd">
    <servers>
        <server ip="10.8.40.26" port="2280" http-port="8080" />
        <server ip="10.8.40.27" port="2280" http-port="8080" />
        <server ip="10.8.40.28" port="2280" http-port="8080" />
    </servers>
</config>

配置说明:

  • mode : 定义配置模式,固定值为client;–暂未使用
  • servers : 定义多个服务端信息;
  • server : 定义某个服务端信息;
  • ip : 配置服务端(cat-home)对外IP地址
  • port : 配置服务端(cat-home)对外TCP协议开启端口,固定值为2280;
  • http-port : 配置服务端(cat-home)对外HTTP协议开启端口, 如:tomcat默认是8080端口,若未指定,默认为8080

2. 修改数据库配置文件:datasources.xml

打开/data/appdatas/cat/datasources.xml数据库配置文件,

<data-sources>
    <data-source id="cat">
        <maximum-pool-size>3</maximum-pool-size>
        <connection-timeout>1s</connection-timeout>
        <idle-timeout>10m</idle-timeout>
        <statement-cache-size>1000</statement-cache-size>
        <properties>
            <driver>com.mysql.jdbc.Driver</driver>
            <url><![CDATA[jdbc:mysql://10.8.40.147:3306/cat]]></url>
            <user>root</user>
            <password>mysql</password>
            <connectionProperties>
                <![CDATA[useUnicode=true&autoReconnect=true]]>
            </connectionProperties>
        </properties>
    </data-source> 
    <data-source id="app">
        <maximum-pool-size>3</maximum-pool-size>
        <connection-timeout>1s</connection-timeout>
        <idle-timeout>10m</idle-timeout>
        <statement-cache-size>1000</statement-cache-size>
        <properties>
            <driver>com.mysql.jdbc.Driver</driver>
            <url><![CDATA[jdbc:mysql://10.8.40.147:3306/cat]]></url>
            <user>root</user>
            <password>mysql</password>
            <connectionProperties>
                <![CDATA[useUnicode=true&autoReconnect=true]]>
            </connectionProperties>
        </properties>
    </data-source>
</data-sources>

配置说明:

  • 主要修改项为:url(数据库连接地址)、user(数据库用户名)、password(数据用户登录密码)

3.修改服务端服务配置:server.xml

打开/data/appdatas/cat/server.xml服务端服务配置文件,

<config local-mode="false" hdfs-machine="false" job-machine="true" alert-machine="true">
    <storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="7" local-logivew-storage-time="7">
        <hdfs id="logview" max-size="128M" server-uri="hdfs://10.8.40.31/user/cat" base-dir="logview"/>
        <hdfs id="dump" max-size="128M" server-uri="hdfs://10.8.40.32/user/cat" base-dir="dump"/>
        <hdfs id="remote" max-size="128M" server-uri="hdfs://10.8.40.33/user/cat" base-dir="remote"/>
    </storage>
    <console default-domain="Cat" show-cat-domain="true">
        <remote-servers>10.8.40.26:8080,10.8.40.27:8080,10.8.40.28:8080</remote-servers>
    </console>
    <ldap ldapUrl="ldap://10.8.40.21:389/DC=dianpingoa,DC=com"/>
</config>

配置说明:

  • local-mode : 定义服务是否为本地模式(开发模式),在生产环境时,设置为false,启动远程监听模式。默认为 false;
  • hdfs-machine : 定义是否启用HDFS存储方式,默认为 false;
  • job-machine : 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false;
  • alert-machine : 定义当前服务是否为报警机(开启各类报警监听,只需要一台服务机开启此功能),默认为 false;
  • storage : 定义数据存储配置信息
  • local-report-storage-time : 定义本地报告存放时长,单位为(天)
  • local-logivew-storage-time : 定义本地日志存放时长,单位为(天)
  • local-base-dir : 定义本地数据存储目录
  • hdfs : 定义HDFS配置信息,便于直接登录系统
  • server-uri : 定义HDFS服务地址
  • console : 定义服务控制台信息
  • remote-servers : 定义HTTP服务列表,(远程监听端同步更新服务端信息即取此值)
  • ldap : 定义LDAP配置信息
  • ldapUrl : 定义LDAP服务地址

4.修改路由配置

登入 cat系统,修改路由配置,打开浏览器,输入http://10.8.40.26:8080/cat/

配置--》全局告警配置--》客户端路由,进入配置路由界面:

<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="127.0.0.1" backup-server-port="2280">
   <default-server id="127.0.0.1" weight="0.8" port="2280" enable="true"/>
   <network-policy id="default" title="default" block="false" server-group="default_machine">
   </network-policy>
   <server-group id="default_machine" title="????">
      <group-server id="127.0.0.1"/>
   </server-group>
   <domain id="cat">
      <group id="default">
         <server id="127.0.0.1" port="2280" weight="1.0"/>
      </group>
   </domain>
</router-config>
  • 把backup-server设置为当前服务器对外IP地址,端口固定为2280;
  • default-server定义可跳转的路由地址,可以设置多个。default-server的id属性配置可路由的cat-home服务IP地址,端口固定为2280;若需要禁用路由地址,可把enable设置为false。
  • 点击“提交”按钮,保存修改的路由配置

5. 复制配置到27、28两机器

  • 拷贝 10.8.40.26机器/data/appdatas/cat/目录中client.xml、server.xml、datasources.xml三个配置文件到27、28两机器相同目录中
  • 修改server.xml配置中的 job-machine 和 alert-machine属性,都设置为false,禁用生成报告和报警功能,只开启监听功能
  • 启动27、28上的Tomcat,开启cat服务,完成服务端的配置及启动
  • 若服务端只分配一台服务器,按10.8.40.26完成安装配置即可

这里记录我安装配置的过程,更详细的文档查看官网