美文网首页中间件微服务spring
调用链监控 CAT 之 入门

调用链监控 CAT 之 入门

作者: 程序员果果 | 来源:发表于2019-04-11 09:15 被阅读173次

    文章首发于微信公众号《程序员果果》
    地址:https://mp.weixin.qq.com/s/G15cw9yXpq4cOFB2C29JYw

    简介

    CAT 是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,基本接入了美团上海所有核心应用。目前在中间件(MVC、RPC、数据库、缓存等)框架中得到广泛应用,为美团各业务线提供系统的性能指标、健康状况、监控告警等。

    优势

    • 实时处理:信息的价值会随时间锐减,尤其是事故处理过程中。
    • 全量数据:全量采集指标数据,便于深度分析故障案例。
    • 高可用:故障的还原与问题定位,需要高可用监控来支撑。
    • 故障容忍:故障不影响业务正常运转、对业务透明。
    • 高吞吐:海量监控数据的收集,需要高吞吐能力做保证。
    • 可扩展:支持分布式、跨 IDC 部署,横向扩展的监控系统。

    开源产品比较

    快速上手

    本地部署

    步骤1:部署tomcat

    准备一个tomcat,修改 tomcat conf 目录下 server.xml,防中文乱码。

    Connector port="8080" protocol="HTTP/1.1"
               URIEncoding="utf-8"    connectionTimeout="20000"
                   redirectPort="8443" />  <!-- 增加  URIEncoding="utf-8"  -->
    

    步骤2:程序对于/data/目录具体读写权限(重要)

    • Linux

    • 要求/data/目录能进行读写操作,如果/data/目录不能写,建议使用linux的软链接链接到一个固定可写的目录。

    • 此目录会存一些CAT必要的配置文件以及运行时候的数据存储目录。

    • CAT支持CAT_HOME环境变量,可以通过JVM参数修改默认的路径。

    mkdir /data
    chmod -R 777 /data/
    
    • Windows

    对程序运行盘下的/data/appdatas/cat和/data/applogs/cat有读写权限。例如cat服务运行在e盘的tomcat中,则需要对e:/data/appdatas/cat和e:/data/applogs/cat有读写权限。

    步骤3: 配置/data/appdatas/cat/client.xml ($CAT_HOME/client.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <config mode="client">
        <servers>
            <server ip="127.0.0.1" port="2280" http-port="8080"/>
        </servers>
    </config>
    

    此配置文件的作用是所有的客户端都需要一个地址指向CAT的服务端。

    步骤4: 安装CAT的数据库

    下载cat源码包:https://codeload.github.com/dianping/cat/
    解压后,数据库的脚本文件为 script/CatApplication.sql

    mysql -uroot -Dcat < CatApplication.sql
    

    步骤5: 配置/data/appdatas/cat/datasources.xml($CAT_HOME/datasources.xml)

    <?xml version="1.0" encoding="utf-8"?>
    
    <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://127.0.0.1:3306/cat]]></url>  <!-- 请替换为真实数据库URL及Port  -->
                <user>root</user>  <!-- 请替换为真实数据库用户名  -->
                <password>root</password>  <!-- 请替换为真实数据库密码  -->
                <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
            </properties>
        </data-source>
    </data-sources>
    

    步骤6: war打包

    官方下载:http://unidal.org/nexus/service/local/repositories/releases/content/com/dianping/cat/cat-home/3.0.0/cat-home-3.0.0.war

    重命名为cat.war进行部署,注意此war是用jdk8,服务端请使用jdk8版本

    步骤7: war部署

    <?xml version="1.0" encoding="utf-8"?>
    <router-config backup-server="你的本机ip(不要用127.0.0.1)" backup-server-port="2280">
       <default-server id="你的本机ip(不要用127.0.0.1)" weight="1.0" port="2280" enable="true"/>
       <network-policy id="default" title="默认" block="false" server-group="default_group">
       </network-policy>
       <server-group id="default_group" title="default-group">
          <group-server id="你的本机ip(不要用127.0.0.1)"/>
       </server-group>
       <domain id="cat">
          <group id="default">
             <server id="你的本机ip(不要用127.0.0.1)" port="2280" weight="1.0"/>
          </group>
       </domain>
    </router-config>
    

    提交后,重启tomcat,访问http://127.0.0.1:8080/cat,出现如下界面,说明搭建成功。

    测试

    安装jar包

    进入cat源码包的 lib/java/jar ,将cat-client-3.0.0.jar 包 安装到本地maven仓库。

    mvn install:install-file -DgroupId=com.dianping.cat -DartifactId=cat-client Dversion=3.0.0 -Dpackaging=jar -Dfile=cat-client-3.0.0.jar
    

    创建工程

    创建一个springboot 工程,关键代码如下。

    pom.xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.dianping.cat</groupId>
        <artifactId>cat-client</artifactId>
        <version>3.0.0</version>
    </dependency>
    

    app.properties

    需要在你的项目中创建 src/main/resources/META-INF/app.properties 文件, 并添加如下内容:

    app.name={appkey}
    

    appkey 只能包含英文字母 (a-z, A-Z)、数字 (0-9)、下划线 (_) 和中划线 (-)

    application.yml

    server:
      port: 8760
    
    spring:
      application:
        name: cat-simple
    

    启动类

    @SpringBootApplication
    @RestController
    public class CatSimpleApplication {
    
    
        public static void main(String[] args) {
            SpringApplication.run( CatSimpleApplication.class, args );
        }
    
        @PostMapping("/hi")
        public String hi(HttpServletRequest request){
            String url = request.getRequestURL().toString();
    
            // 创建一个 Transaction
            Transaction transaction = Cat.newTransaction( "URL", url );
            try {
                // 处理业务
                myBusiness();
                // 设置状态
                transaction.setStatus(Transaction.SUCCESS);
            } catch (Exception e) {
                // 设置错误状态
                transaction.setStatus(e);
                // 记录错误信息
                Cat.logError(e);
            } finally {
                // 结束 Transaction
                transaction.complete();
            }
    
            return "hello";
        }
    
        @PostMapping("/error")
        public String error(HttpServletRequest request){
            String url = request.getRequestURL().toString();
    
            // 创建一个 Transaction
            Transaction transaction = Cat.newTransaction( "URL", url );
            try {
                // 处理业务
                int i = 1 / 0;
                // 设置状态
                transaction.setStatus(Transaction.SUCCESS);
            } catch (Exception e) {
                // 设置错误状态
                transaction.setStatus(e);
                // 记录错误信息
                Cat.logError(e);
            } finally {
                // 结束 Transaction
                transaction.complete();
            }
    
            return "500";
        }
    
        private void myBusiness() {
            //模拟业务处理的时间
            try {
                Thread.sleep( 500 );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    
    }
    

    请求 http://localhost:8760/hi

    curl -X POST  http://localhost:8760/hi
    

    请求 http://localhost:8760/error

    curl -X POST  http://localhost:8760/error
    

    查看监控信息

    进入 cat 控制台,点击 Transaction 按钮 ,之后点击全部,会看到有哪些客户端,如图:

    点击客户端 cat-simple ,出现如图:

    如上图,可以清晰的看到 请求的 总个数(tatal)、均值(avg)、最大/最小(max/min)、标准差(std)等,其他都比较直观,标准差稍微复杂一点,大家自己可以推演一下怎么做增量计算。那集合运算,比如95线(表示95%请求的完成时间)、999线(表示99.9%请求的完成时间)

    点击 “log View” 可以查看 错误信息,如图:

    源码

    https://github.com/gf-huanchupk/SpringCloudLearning/tree/master/chapter14

    参考

    https://github.com/dianping/cat/wiki

    欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~


    相关文章

      网友评论

        本文标题:调用链监控 CAT 之 入门

        本文链接:https://www.haomeiwen.com/subject/fpsziqtx.html