一、 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客户端配置文件
配置说明:
* 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数据库配置文件
配置说明:
* 生成配置文件时,输入的数据库连接信息已写入此文件,如不换数据库,不用做任何修改
* 主要修改:url(数据库连接地址)、user(数据库用户名)、password(数据用户登录密码)
C、 服务端服务配置
打开/data/appdatas/cat/server.xml服务端服务配置文件
配置说明:
* 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,打开客户端路由配置界面
配置说明:
* 把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配置,点击“提交”按钮,保存修改
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
中加入如下配置
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中会出现cross报表,dependency,服务端的matrix以及调用链路的trace信息。
dubbo 接入 (web消费者端)
项目地址:https://github.com/fanlychie/cat-client-dubbo
你可以检出项目手工执行安装到本地的maven
仓库。
接入方式为,在web
项目的消费者端dubbo
配置文件中加入如下配置:
接入后,在Transaction
的URL
中会生成dubbo
调用链路的trace
信息。
接入前的效果图:
接入后的效果图:
B、mybatis 接入
项目地址:https://github.com/fanlychie/cat-client-mybatis
可以检出项目手工执行安装到本地的maven
仓库。
接入方式(spring 的 xml 配置参考方式):
接入后,在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
这是dubbo
的qos
服务端口冲突引起的,其默认使用22222
端口。可以在项目的dubbo.properties
属性配置文件中修改此端口:
# 避免端口冲突, 默认端口22222
dubbo.qos.port=20221