CAT 实时监控与项目集成

一、 CAT概要

1.CAT是什么?

CAT(Central Application Tracking)是大众点评开源的一套基于Java开发的实时应用监控平台,提供了全面的监控服务和业务决策支持。主要应用于服务中间件框架(MVC 框架、RPC 框架、持久层框架、分布式缓存框架)的监控(服务端、移动端、前端),为开发和运维提供各项性能指标、健康检查、自动报警等可视化服务。

依赖环境》》

本地磁盘文件存储(非大数据)方式。所用环境:
- CentOS: 7.4.1708(内核 3.10.0),
- Java: 1.8.0,
- Maven: 3.5.4,
- MySQL: 5.7.20,
- Tomcat: 7.0.90,
- Git Client: 1.8.3.1(版本关系不大),
- Hadoop(可选): 小规模公司可采用磁盘模式,大规模公司采用Hadoop。

2.CAT作用

2.1. 故障快速发现:主要面向运维,让运维直观到生产环境出现的问题;

2.2. 系统问题分析:面向开发,让开发能了解自己系统实时运行状态、发现问题。

3.CAT报表展示消息类型

3.1. Transaction

适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。

3.2. Event

用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。

3.3. Heartbeat

表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等。

3.4. Metric

用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。

3.5. Trace

用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息。

4.CAT架构设计

追求简单、去中心化、分工协作,两层结构,除了依赖外部存储如HDFS和MySQL外,不依赖其他系统,CAT内部全面采用组件化设计和实现。CAT每天消息量巨大,一台机器是不能处理全部流量,必须分片处理,均衡负载。

 

业务应用目前使用CAT API进行埋点,后台异步线程采用TCP长连接方式,将消息源源不断地传输到后台服务器;CAT具有fail-over(故障切换)机制,在后台服务器不可用时会自动切换到另一台可用服务器。CAT目前使用native协议做序列化和反序列化,将来会考虑支持更多协议,比如thrift。

消息被送到后台,经反序列化后会被放入队列,实时消费调度器会将消息分发到所有消费者内部队列,每个消费者只需处理自己的消费队列,各消费者之间彼此相对独立,如果消费速度太慢,导致消费队列满,则新来的消息会被丢弃。典型消费者都采用实时增量计算的方式,流式处理消息,产生的报表会在当前小时结束后保存到中央数据库中。

日报表采用后台作业的形式,由24个小时报表合并得到。周报表则由7个日报表合并得到,以此类推。

CAT控制台,即UI层,负责接收用户请求,从后台存储中将报表信息取出显示。对于实时报表,直接通过HTTP请求分发到相应消费机,待结果返回后聚合展示;历史报表则直接取数据库并展示。

所有原始消息会先存储在本地文件系统,然后上传到HDFS中保存;而对于报表,因其远比原始日志小,则以K/V的方式保存在MySQL中。

5.消息处理

消息处理分五个阶段:收集、传输、分析、存储和展示。

收集阶段:负责业务应用日志的埋点和采集。CAT目前提供多种语言的客户端供业务应用程序调用,埋点结果以消息树的形式存入传输队列。如果队列满,则会自动丢弃当前消息。

传输阶段:CAT客户端负责将客户端消息传输到后端,CAT消费机负责接收消息。传输前CAT客户端会与CAT消费机建立TCP长连接,不断地从客户端队列中取出消息树,序列化后写入网络;CAT消费机则不断地从网络中取出数据,反序列化后放入消费队列。

分析阶段:负责报表生成。实时消费调度器会将消费队列消息取出,分发给每个消费者内部队列;报表分析器只会从自己的报表队列中取出消息树,逐个消费,更新报表模型。CAT以小时为单位形成报表,原始日志转储(raw log dump)是一个特殊的分析器,它不生产报表,而是将消息存入本地文件系统。

存储阶段:负责报表和原始日志的存储,目前报表会存在MySQL中,原始日志压缩后存在HDFS中长久保存。保留时长取决于存储容量的大小,一般报表会保存3个月以上,原始日志保存一个月。

展示阶段:负责数据的可视化。作为用户服务入口,负责报表和原始日志的输出显示。对于实时报表请求,会向各个消费机分发请求,并将结果聚合后输出HTML,在浏览器展示;历史报表会直接取自数据库。XML数据输出是另一种内置的数据展示方式,方便基于CAT开放外围工具。

6.CAT部署结构

在实际开发和部署中,Cat-consumer和Cat-home是部署在一个JVM内部,每个CAT服务端都可以作为consumer也可以作为home,这样既能减少整个层级结构,也可以增加系统稳定性。

 

说明:

路由中心是根据应用所在机房信息来决定客户端上报的CAT服务端地址;

每个机房内部都有独立的原始信息存储集群HDFS;

CAT-home可以部署在一个机房也可以部署在多个机房,在最后做展示的时候,home会从consumer中进行跨机房的调用,将所有的数据合并展示给用户;

实际过程中,consumer、home以及路由中心都是部署在一起的,每个服务端节点都可以充当任何一个角色。

7.Cat监控示例

Dubbo、Spring主流框架集成cat可通过过滤器(Filter)和AOP进行全局处理。针对不是主要的业务,有全局过滤器即可对其监控,针对单独的、特殊业务监控则需单独处理。

以dubbo应用为例:消费者向服务提供者发出请求,最终得到反馈数据。那么这个流程从发出请求到最终接收数据,经历了什么?消费者发出调用TestManager.timer请求,最终耗时1870ms。

二、CAT服务端安装

1.环境准备

ØMaven3.2.5以上

ØJdk1.6、jdk1.7、jdk1.8

ØWeb容器(Tomcat8.0.28(服务端cat)、jetty)

ØMysql5.1+

2.项目安装与部署

2.1下载与安装

从github上将CAT下载至本地:https://github.com/dianping/cat,并解压下载的文件。

安装步骤:

1. 构建CAT war包
  进入下载并解压的Cat文件, 在CAT跟目录下,用maven构建项目 
      mvn clean install –DskipTests
2.  创建CAT库表
   新建cat数据库并执行源码/source/cat/script/CatApplication.sql脚本完成表结构的创建。
3.  配置文件:

如果客户端程序是运行在Windows系统中,例如应用程序项目所在的目录路径是D:\workspace\idea\scat。那么,需要在此项目所在的盘符(即这里的D盘)创建data\appdatas\cat目录;如果客户端程序是运行在Linux系统中,那么需要创建/data/appdatas/cat目录,并确保运行程序的用户对此目录有读写权限。配置文件内容一样。
根据操作系统的不同,拷贝client.xml、server.xml、datasources.xml文件到相应目录,如/data/appdatas/cat/目录中
   A、   客户端配置
   打开/data/appdatas/cat/client.xml客户端配置文件
   <?xml version="1.0" encoding="utf-8"?>
 
   <config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
      <servers>
        <!-- Local mode for development -->
         <server ip="172.16.136.143" port="2280" http-port="8999" />
         <server ip="172.16.114.114" port="2280" http-port="8999" />
      </servers>
   </config>
   配置说明:
  * mode : 定义配置模式,固定值为client;--暂未使用
  * servers : 定义多个服务端信息;
  * server : 定义某个服务端信息;
  * ip : 配置服务端(cat-home)对外IP地址
  * port : 配置服务端(cat-home)对外TCP协议开启端口,固定值为2280;
  * http-port : 配置服务端(cat-home)对外HTTP协议开启端口, 如:tomcat默认是8080端口,若未指定,默认为8080端口;
   B、   数据库配置
   打开/data/appdatas/cat/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://mysql.rds.aliyuncs.com:3306/cat]]></url>
           <user>rw</user>
           <password>111</password>
        <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&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://mysql.rds.aliyuncs.com:3306/cat]]></url>
           <user>rw</user>
           <password>222</password>
        <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true]]></connectionProperties>
        </properties>
      </data-source>
   </data-sources>
   配置说明:
  * 生成配置文件时,输入的数据库连接信息已写入此文件,如不换数据库,不用做任何修改
  * 主要修改:url(数据库连接地址)、user(数据库用户名)、password(数据用户登录密码)
C、   服务端服务配置
   打开/data/appdatas/cat/server.xml服务端服务配置文件
   <?xml version="1.0" encoding="utf-8"?>
   <!-- Configuration for development environment-->
   <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">
      </storage>
     
      <console default-domain="Cat" show-cat-domain="true">
        <remote-servers>172.16.29.225:8999, 172.16.136.143:8999, 172.16.114.114:8999</remote-servers>  
      </console>
     
      <ldap ldapUrl="ldap://192.168.50.11:389/DC=dianpingoa,DC=com"/>
   </config>
   配置说明:
  * local-mode : 定义服务是否为本地模式(开发模式),在生成环境时,设置为false,启动远程监听模式。默认为 false;(示例为报警报告机配置)
  * hdfs-machine : 定义是否启用HDFS存储方式,默认为 false;
  * job-machine : 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false;
  * alert-machine : 定义当前服务是否为报警机(开启各类报警监听,只需要一台服务机开启此功能),默认为 false;
  * storage : 定义数据存储配置信息。这里定义了本地目录/data/appdatas/cat/buket/为存储目录,本地报告及本地日志保存时间均为7天。
  * local-report-storage-time : 定义本地报告存放时长,单位为(天)
  * local-logivew-storage-time : 定义本地日志存放时长,单位为(天)
  * local-base-dir : 定义本地数据存储目录
  * hdfs : 定义HDFS配置信息,便于直接登录系统
  * server-uri : 定义HDFS服务地址
  * console : 定义服务控制台信息。定义默认的domain为Cat(每个cat应用要求都需要有一个domain,Cat本身的domain为Cat),并显示cat的domain。
  * remote-servers : 定义HTTP服务列表,(远程监听端同步更新服务端信息即取此值)
  * ldap : 定义LDAP配置信息
  * ldapUrl : 定义LDAP服务地址
4. 拷贝监控系统源码/source/cat/cat-home/target/目录下的cat-alpha-1.3.3.war到web应用服务器的发布目录
(如:$TOMCAT_HOME$/webapps/),并修改war包名称为cat.war
5.  启动应用服务器,如tomcat
6.  登录CAT HOME系统,修改配置
   A、修改路由配置
   选择‘配置-->全局警告配置–>客户端路由’,
   或者在浏览器地址栏中直接输入http:/172.16.29.225:8999/cat/s/config?op=routerConfigUpdate,打开客户端路由配置界面
   <?xml version="1.0" encoding="utf-8"?>
   <router-config backup-server="172.16.29.225" backup-server-port="2280">
      <default-server id="172.16.136.143" weight="1.0" port="2280" enable="true"/>
      <default-server id="172.16.114.114" weight="1.0" port="2280" enable="true"/>
   </router-config>
   配置说明:
   * 把backup-server设置为当前服务器对外IP地址,端口固定为2280;
    * default-server定义可跳转的路由地址,可以设置多个。default-server的id属性配置可路由的cat-home服务IP地址,端口固定为2280;若需要禁用路由地址,可把enable设置为false。
   * 点击“提交”按钮,保存修改的路由配置  
B、修改告警服务端配置
   选择‘配置-->全局警告配置–>告警服务端’,
   或者在浏览器地址栏中直接输入http:/172.16.29.225:8999/cat/s/config?op=alertSenderConfigUpdate,打开客户端路由配置界面
   删除默认sender-config配置,点击“提交”按钮,保存修改
   <?xml version="1.0" encoding="utf-8"?>
   <sender-config>
   </sender-config>  
C、修改Ping告警配置
   选择‘配置-->应用监控配置–>ping告警配置’,
   或者在浏览器地址栏中直接输入http:/172.16.29.225:8999/cat/s/config?op=thirdPartyRuleConfigs,打开客户端路由配置界面
   删除默认url (http监控)配置
7.部署其他监控集群
   A. 拷贝运行正常的CAT机器/data/appdatas/cat/目录中client.xml、server.xml、datasources.xml三个配置文件到监控机相同目录中
   B. 修改server.xml配置中的 job-machine 和 alert-machine属性,都设置为false,禁用生成报告和报警功能,只开启监听功能
   C. 拷贝cat.war到其他监控集群
   D. 启动应用服务器,开启cat服务,完成服务端的配置及启动

3、启动与运行

将E:\cat\1.4.0\cat-master\cat-home\target目录下的cat-alpha-1.4.0.war复制到web容器(eg:Tomcat的webapps目录)并重命名为cat.war,启动tomcat,浏览器中输入地址http://Ip:port/cat/ (http://127.0.0.1/cat)看到如下界面表示运行成功

Tomcat启动参数参考: tomcat启动参数参考:-Xms20288m -Xmx20288m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=10144m -XX:MaxNewSize=10144m -XX:SurvivorRatio=10

Tomcat必须设置encoding格式:URIEncoding=”UTF-8”。

三、框架集成(Spring Boot/SpringMVC、MyBatis、Dubbo ...)

3.1、URL 监控埋点

本机全局指定 Maven 仓库

由于 cat-client 等开发包并未加入 Maven 官方仓库(repo1.maven.org),所以需要指定 cat 专用的远程仓库。

或者在项目的pom.xml文件中引入Cat的中央仓库。

客户端程序接入CAT需要依赖cat-client包。由于cat-client没有加入maven远程中央仓库,因此需要指定CAT专用的远程仓库。在需要接入CAT监控平台的web项目的pom.xml中加入如下配置

<repositories>

<!-- CAT client 仓库 -->

<repository>

<id>unidal-nexus-repo</id>

<url>http://unidal.org/nexus/content/repositories/releases</url>

</repository>

</repositories>

<dependencies>

<!-- 客户端接入CAT的依赖 -->

<dependency>

<groupId>com.dianping.cat</groupId>

<artifactId>cat-client</artifactId>

<version>${cat-client.version}</version>    <!-- 2.0.0 -->

</dependency>

</dependencies>

3.2、集成Spring Boot(或者SpringMVC)、Dubbo等框架。

3.2.1 修改pom.xml,引入cat 依赖包:

3.2.2  添加过滤器。

复制 CatFilterConfigure 到你的工程项目。将CatFilterConfigure.java 放到任意SpringBoot 能扫描到的package下面:

 

spring boot项目 (CatFilterConfigure.java)

如果使用springmvc,spring mvc项目的过滤器:

也可以自定义过滤器,以spring mvc为例,如下步骤:

配置web.xml:

springmvc.xml配置文件如下:

自定义拦截器代码如:

3.2.3 配置监控项目名 -  domain信息配置

在需要被监听的项目src/main/resources/META-INF目录下添加配置文件app.properties

文件内容为:

app.name=demo(自己定义要和平台定义的CMDB一致即可)

在META-INF下面创建client.xml文启动项目:

3.2.4 编写控制器

A、添加注解

B、不使用注解

3.2.5 /data/appdatas/cat/目录下,新建一个client.xml文件

 1、如果系统是windows环境,则在应用运行的盘,比如D盘,新建/data/appdatas/cat/目录,新建client.xml文件

2、项目文件中source中的client.xml,此文件代表了这个项目我是谁,比如项目的名字Cat。

3、/data/appdatas/cat/client.xml,此文件有OP控制,这里的Domain名字用来做开关,如果一台机器上部署了多个应用,可以指定把一个应用的监控关闭。

Eg:/data/appdatas/cat下的client.xml配置如下:

3.2.6、CAT的Log4j集成 【建议所有Log都打到CAT,这样才能更快发现问题】

注:业务程序的所有异常都通过记录到CAT中,方便看到业务程序的问题,建议在Root节点中添加次appendar

在Log4j的properties或xml中,加入Cat的Appender

启动cat不属性的容器,如tomcat,出现下面类似日志说明加载成功。

查看cat控制台

既可以看到demo输出到cat的日志。

说明:cat初始化安装参照官方文档

 

3.2.7 更多集成:

A 、集成Dubbo

在 pom.xml 中添加依赖

dubbo 接入 (生产者端)

项目地址:https://github.com/fanlychie/cat-dubbo-monitor

可以检出项目手工执行安装到本地的maven仓库。

<!-- CAT mybatis和dubbo 仓库 -->

<repositories>

<repository>

<id>fanlychie-maven-repo</id>

<url>https://raw.github.com/fanlychie/maven-repo/releases</url>

</repository>

</repositories>

<dependencies>

<!-- dubbo接入CAT的依赖 -->

<dependency>

<groupId>net.dubboclub</groupId>

<artifactId>cat-dubbo-monitor</artifactId>

<version>0.0.6</version>

</dependency>

</dependencies>

接入方式:只需要声明依赖包,不需要做任何配置。接入后,在cat中会出现cross报表,dependency,服务端的matrix以及调用链路的trace信息。

dubbo 接入 (web消费者端)

项目地址:https://github.com/fanlychie/cat-client-dubbo

你可以检出项目手工执行安装到本地的maven仓库。

<!-- CAT mybatis和dubbo 仓库 -->

<repositories>

<repository>

<id>fanlychie-maven-repo</id>

<url>https://raw.github.com/fanlychie/maven-repo/releases</url>

</repository>

</repositories>

<dependencies>

<!-- 客户端dubbo接入CAT -->

<dependency>

<groupId>org.fanlychie</groupId>

<artifactId>cat-client-dubbo</artifactId>

<version>1.0.1</version>

</dependency>

</dependencies>

接入方式为,在web项目的消费者端dubbo配置文件中加入如下配置:

<dubbo:consumer filter="CatClientFilter"/>

接入后,在TransactionURL中会生成dubbo调用链路的trace信息。

接入前的效果图:

接入后的效果图:

B、mybatis 接入

项目地址:https://github.com/fanlychie/cat-client-mybatis

可以检出项目手工执行安装到本地的maven仓库。

<!-- CAT mybatis和dubbo 仓库 -->

<repositories>

<repository>

<id>fanlychie-maven-repo</id>

<url>https://raw.github.com/fanlychie/maven-repo/releases</url>

</repository>

</repositories>

<dependencies>

<!-- mybatis接入CAT的依赖 -->

<dependency>

<groupId>com.dianping.cat</groupId>

<artifactId>cat-client-mybatis</artifactId>

<version>2.0.0</version>

</dependency>

</dependencies>

接入方式(spring 的 xml 配置参考方式):

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<property name="typeAliasesPackage" value="org.xyy.entity"/>

<property name="configLocation" value="classpath:mybatis-config.xml"/>

<property name="mapperLocations" value="classpath*:mapper/*.xml"/>

<!-- MyBatis 接入 CAT -->

<property name="plugins">

<array>

<bean class="com.wanda.cat.sample.plugins.CatMybatisPlugin"></bean>

</array>

</property>

</bean>

接入后,在Transaction中会生成SQL信息。效果图:

C、log4j 接入

异常日志信息接入将异常日志上报到CAT服务器,方便查看异常日志。

log4j.rootCategory = INFO, ...xxx... , CAT

# 异常日志上报到CAT

log4j.appender.CAT = com.dianping.cat.log4j.CatAppender

log4j.appender.CAT.Threshold = ERROR

项目启动报错问题

当启动两个或以上依赖cat-client包的项目的时候,会报出如下错误,致使服务无法正常提供服务:

2018-08-05 23:14:01:326 [main] ERROR [Server:102] - [DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.6.0, current host: 127.0.0.1

java.net.BindException: Address already in use: bind

这是dubboqos服务端口冲突引起的,其默认使用22222端口。可以在项目的dubbo.properties属性配置文件中修改此端口:

# 避免端口冲突, 默认端口22222

dubbo.qos.port=20221

猜你喜欢

转载自blog.csdn.net/zou100/article/details/84998780
cat