Cat
Cat 基于Java开发的实时应用监控平台,包括实时应用监控,业务监控
消息类型
CAT支持的监控消息类型包括:
-
Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。
-
Event 用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。
-
Heartbeat 表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等。
-
Metric 用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。
-
Trace 用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息
消息树
CAT监控系统将每次URL、Service的请求内部执行情况都封装为一个完整的消息树、消息树可能包括Transaction、Event、Heartbeat、Metric和Trace信息。
快速入门
1、 下载
$ git clone https://github.com/dianping/cat
2、 安装
$ mvn clean install -DskipTests
3、 配置 Cat 环境
$ mvn cat:install
[INFO] 准备 Cat 环境...
请输入 jdbc url:[jdbc:mysql://127.0.0.1:3306]jdbc:mysql://127.0.0.1:3306
请输入用户名:root
请输入密码:[]123456
[INFO] jdbc.url: jdbc:mysql://127.0.0.1:3306
[INFO] jdbc.user: root
[INFO] jdbc.password: 123456
[INFO] 连接数据库(jdbc:mysql://127.0.0.1:3306) ...
[INFO] 成功连接到数据库(jdbc:mysql://127.0.0.1:3306)
[INFO] 正在创建数据库(cat) ...
[INFO] 数据库(cat) 创建成功
[INFO] 正在创建数据表 ...
[INFO] 数据表创建成功
4、 权限配置
对 /data/appdatas/cat
和 /data/applogs/cat
进行权限设置
- /data/appdatas/cat 目录用于存放 Cat 主目录的配置文件
- /data/applogs/cat 目录用于存放 Cat 主目录的日志文件
[ERROR] 没有权限读写 /data/appdatas/cat,请手动创建此目录
创建并设置权限
$ sudo mkdir /data/appdatas/cat
$ sudo mkdir /data/applogs/cat
$ sudo chmod 777 /data/appdatas/cat
$ sudo chmod 777 /data/applogs/cat
5、 重新配置 Cat 环境
houbinbindeMacBook-Pro:cat houbinbin$ pwd
/Users/houbinbin/it/code/cat
[INFO] 准备 Cat 环境...
请输入 jdbc url:[jdbc:mysql://127.0.0.1:3306]jdbc:mysql://127.0.0.1:3306
请输入用户名:root
请输入密码:[]123456
[INFO] jdbc.url: jdbc:mysql://127.0.0.1:3306
[INFO] jdbc.user: root
[INFO] jdbc.password: 123456
[INFO] 连接数据库(jdbc:mysql://127.0.0.1:3306) ...
[INFO] 成功连接到数据库(jdbc:mysql://127.0.0.1:3306)
[INFO] 正在创建数据库(cat) ...
[INFO] 数据库 'cat' 已存在,先删除它...
[INFO] 数据库 'cat' 已删除
[INFO] 数据库(cat) 创建成功
[INFO] 正在创建数据表 ...
[INFO] 数据表创建成功
[INFO] 正在生成配置文件到 /data/appdatas/cat ...
[INFO] 配置文件生成成功
[INFO] 准备 Cat 环境 ... 完成
[INFO] 使用以下命令启动本地 Cat 服务器:
[INFO] cd cat-home; mvn jetty:run
[INFO] 请在浏览器中打开 http://localhost:2281/cat
6、 运行 Cat
$ cd cat-home
$ mvn jetty:run
7、 访问
在浏览器中输入 http://localhost:2281/cat
默认用户名密码:
root/123456
部署埋点
注意!!!: 必须使用JDK1.7, JDK1.8 虽然可以跑。但是最后会报错。
再次提醒:如果安装了多个版本的jdk,编译前先将jdk版本切换到jdk 1.7(包括编译成功后,运行时也要jdk 1.7环境)
文档见: (【文档】-》【部署文档】)
http://localhost:2281/cat/r/home?op=view&docName=deploy
为了测试,暂时本地简单启动一个服务, 假设为我们的app(localhost:18080
)(ps:后来发现8081和nexus冲突,就改了下端口。)。
1) 设置cat服务/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="127.0.0.1" port="2280" http-port="2281" />
</servers>
</config>
2) 配置服务端的数据库配置datasources.xml
,文件路径/data/appdatas/cat/datasources.xml
,需要替换对应的线上配置
上面的对应cat服务数据库。下面的为我们的app数据库。
<?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>
<user>root</user>
<password>123456</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://127.0.0.1:3306/blog]]></url>
<user>root</user>
<password>123456</password>
<connectionProperties><![CDATA[useUnicode=true&autoReconnect=true]]></connectionProperties>
</properties>
</data-source>
</data-sources>
3) 配置服务端的server.xml
,文件路径/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="false">
<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>127.0.0.1:2281</remote-servers>
</console>
</config>
4) 路由配置, 默认用户 catadmin/catadmin
http://127.0.0.1:2281/cat/s/config?op=routerConfigUpdate
默认进入【全局告警配置】-》【客户端路由】,修改内容如下:
<?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="1.0" port="2280" enable="true"/>
</router-config>
客户端集成
项目中需要引入 cat-client-XXX.jar
and cat-core-XXX.jar
。这两个jar包如果想使用maven怎么得到呢?
-
本地使用: cat 项目直接
mvn clean install
会将 jar 安装到本地。 -
将cat视为自己的项目,直接打包到nexus上。
-
支持广泛使用: jar上传到 nexus 上。
blog
pom.xml 添加:
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId>
<version>1.4.0</version>
</dependency>
1) Web.xml中新增filter
注:如果项目是对外不提供URL访问,比如GroupService,仅仅提供Pigeon服务,则不需要。
Filter放在url-rewrite-filter 之后的第一个,如果不是会导致URL的个数无限多,比如search/1/2,search/2/3等等,无法监控,后端存储压力也变大。
暂时跳过。
<filter>
<filter-name>cat-filter</filter-name>
<filter-class>com.dianping.cat.servlet.CatFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cat-filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
2) 设置domain (cat-core 1.1.3之后版本,优先读取A配置)
A) 在资源文件中新建app.properties文件
在resources资源文件META-INF下,注意是src/main/resources/META-INF/文件夹, 而不是webapps下的那个META-INF,添加app.properties,加上domain配置,如:
app.name=blog
B) 在资源文件中新建client.xml文件
在resources资源文件META-INF下,新建cat文件夹,注意是src/main/resources/META-INF/cat/client.xml文件, 而不是webapps下的那个META-INF,domain id表示项目名称此处为CMDB申请的名字,比如
<config mode="client">
<domain id="tuangou-web"/>
</config>
3) /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="127.0.0.1" port="2280" http-port="2281" />
<domain id="blog" enabled="true"/>
</servers>
</config>
4) 与 Log4j2 集成
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off" monitorInterval="1800">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %logger{36}:%L - %msg%n"/>
</Console>
<!--cat log-->
<appender name="CatAppender" class="com.dianping.cat.log4j.CatAppender"/>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="CatAppender"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
报错
启动后一直报错如下:
java.lang.RuntimeException: Unable to get instance of Logger, please make sure the environment was setup correctly!
org.unidal.initialization.DefaultModuleContext.<init>(DefaultModuleContext.java:28)
com.dianping.cat.Cat.initialize(Cat.java:91)
com.dianping.cat.Cat.initialize(Cat.java:87)
com.dianping.cat.Cat.checkAndInitialize(Cat.java:45)
com.dianping.cat.Cat.getManager(Cat.java:72)
com.dianping.cat.servlet.CatFilter$CatHandler$1.handle(CatFilter.java:104)
com.dianping.cat.servlet.CatFilter$Context.handle(CatFilter.java:406)
com.dianping.cat.servlet.CatFilter.doFilter(CatFilter.java:53)
root cause
根据如下可知,应该是mvn-tomcat-plugin
造成的冲突,就改成了jetty插件。亲测可行。