参考官方文档:https://github.com/dianping/cat/wiki/readme_server
1.数据库相关
(1)创建数据库cat,并执行以下sql创建相关表:
create database cat
use cat
CREATE TABLE `dailyreport` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...',
`ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器',
`domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息',
`period` datetime NOT NULL COMMENT '报表时间段',
`type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1',
`creation_date` datetime NOT NULL COMMENT '报表创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `period` (`period`,`domain`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='天报表';
CREATE TABLE `weeklyreport` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...',
`ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器',
`domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息',
`period` datetime NOT NULL COMMENT '报表时间段',
`type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1',
`creation_date` datetime NOT NULL COMMENT '报表创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `period` (`period`,`domain`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='周报表';
CREATE TABLE `monthreport` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...',
`ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-consumer机器',
`domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息',
`period` datetime NOT NULL COMMENT '报表时间段',
`type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 默认1',
`creation_date` datetime NOT NULL COMMENT '报表创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `period` (`period`,`domain`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='月报表';
CREATE TABLE `hostinfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(50) NOT NULL COMMENT '部署机器IP',
`domain` varchar(200) NOT NULL COMMENT '部署机器对应的项目名',
`hostname` varchar(200) DEFAULT NULL COMMENT '机器域名',
`creation_date` datetime NOT NULL,
`last_modified_date` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ip_index` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP和项目名的对应关系';
CREATE TABLE `hourlyreport` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` tinyint(4) NOT NULL COMMENT '报表类型, 1/xml, 9/binary 默认1',
`name` varchar(20) NOT NULL COMMENT '报表名称',
`ip` varchar(50) DEFAULT NULL COMMENT '报表来自于哪台机器',
`domain` varchar(50) NOT NULL COMMENT '报表项目',
`period` datetime NOT NULL COMMENT '报表时间段',
`creation_date` datetime NOT NULL COMMENT '报表创建时间',
PRIMARY KEY (`id`),
KEY `IX_Domain_Name_Period` (`domain`,`name`,`period`),
KEY `IX_Name_Period` (`name`,`period`),
KEY `IX_Period` (`period`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='用于存放实时报表信息,处理之后的结果';
CREATE TABLE `hourly_report_content` (
`report_id` int(11) NOT NULL COMMENT '报表ID',
`content` longblob NOT NULL COMMENT '二进制报表内容',
`period` datetime NOT NULL COMMENT '报表时间段',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`report_id`),
KEY `IX_Period` (`period`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='小时报表二进制内容';
CREATE TABLE `daily_report_content` (
`report_id` int(11) NOT NULL COMMENT '报表ID',
`content` longblob NOT NULL COMMENT '二进制报表内容',
`period` datetime COMMENT '报表时间段',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`report_id`),
KEY `IX_Period` (`period`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='天报表二进制内容';
CREATE TABLE `weekly_report_content` (
`report_id` int(11) NOT NULL COMMENT '报表ID',
`content` longblob NOT NULL COMMENT '二进制报表内容',
`period` datetime COMMENT '报表时间段',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`report_id`),
KEY `IX_Period` (`period`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='周报表二进制内容';
CREATE TABLE `monthly_report_content` (
`report_id` int(11) NOT NULL COMMENT '报表ID',
`content` longblob NOT NULL COMMENT '二进制报表内容',
`period` datetime COMMENT '报表时间段',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`report_id`),
KEY `IX_Period` (`period`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='月报表二进制内容';
CREATE TABLE `businessReport` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` tinyint(4) NOT NULL COMMENT '报表类型 报表数据格式, 1/Binary, 2/xml , 3/json',
`name` varchar(20) NOT NULL COMMENT '报表名称',
`ip` varchar(50) NOT NULL COMMENT '报表来自于哪台机器',
`productLine` varchar(50) NOT NULL COMMENT '指标来源于哪个产品组',
`period` datetime NOT NULL COMMENT '报表时间段',
`content` longblob COMMENT '用于存放报表的具体内容',
`creation_date` datetime NOT NULL COMMENT '报表创建时间',
PRIMARY KEY (`id`),
KEY `IX_Period_productLine_name` (`period`,`productLine`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='用于存放业务监控实时报表信息,处理之后的结果';
CREATE TABLE `task` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`producer` varchar(20) NOT NULL COMMENT '任务创建者ip',
`consumer` varchar(20) NULL COMMENT '任务执行者ip',
`failure_count` tinyint(4) NOT NULL COMMENT '任务失败次数',
`report_name` varchar(20) NOT NULL COMMENT '报表名称, transaction, problem...',
`report_domain` varchar(50) NOT NULL COMMENT '报表处理的Domain信息',
`report_period` datetime NOT NULL COMMENT '报表时间',
`status` tinyint(4) NOT NULL COMMENT '执行状态: 1/todo, 2/doing, 3/done 4/failed',
`task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0表示小时任务,1表示天任务',
`creation_date` datetime NOT NULL COMMENT '任务创建时间',
`start_date` datetime NULL COMMENT '开始时间, 这次执行开始时间',
`end_date` datetime NULL COMMENT '结束时间, 这次执行结束时间',
PRIMARY KEY (`id`),
UNIQUE KEY `task_period_domain_name_type` (`report_period`,`report_domain`,`report_name`,`task_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台任务';
CREATE TABLE `project` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain` varchar(200) NOT NULL COMMENT '项目名称',
`cmdb_domain` varchar(200) DEFAULT NULL COMMENT 'cmdb项目名称',
`level` int(5) DEFAULT NULL COMMENT '项目级别',
`bu` varchar(50) DEFAULT NULL COMMENT 'CMDB事业部',
`cmdb_productline` varchar(50) DEFAULT NULL COMMENT 'CMDB产品线',
`owner` varchar(50) DEFAULT NULL COMMENT '项目负责人',
`email` longtext DEFAULT NULL COMMENT '项目组邮件',
`phone` longtext DEFAULT NULL COMMENT '联系电话',
`creation_date` datetime DEFAULT NULL COMMENT '创建时间',
`modify_date` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='项目基本信息';
CREATE TABLE `topologyGraph` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(50) NOT NULL COMMENT '报表来自于哪台cat-client机器ip',
`period` datetime NOT NULL COMMENT '报表时间段,精确到分钟',
`type` tinyint(4) NOT NULL COMMENT '报表数据格式, 1/xml, 2/json, 3/binary',
`content` longblob COMMENT '用于存放报表的具体内容',
`creation_date` datetime NOT NULL COMMENT '报表创建时间',
PRIMARY KEY (`id`),
KEY `period` (`period`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于存储历史的拓扑图曲线';
CREATE TABLE `config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '配置名称',
`content` longtext COMMENT '配置的具体内容',
`creation_date` datetime NOT NULL COMMENT '配置创建时间',
`modify_date` datetime NOT NULL COMMENT '配置修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于存储系统的全局配置信息';
CREATE TABLE `baseline` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`report_name` varchar(100) DEFAULT NULL,
`index_key` varchar(100) DEFAULT NULL,
`report_period` datetime DEFAULT NULL,
`data` blob,
`creation_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `period_name_key` (`report_period`,`report_name`,`index_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `alteration` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`type` varchar(64) NOT NULL COMMENT '分类',
`title` varchar(128) NOT NULL COMMENT '变更标题',
`domain` varchar(128) NOT NULL COMMENT '变更项目',
`hostname` varchar(128) NOT NULL COMMENT '变更机器名',
`ip` varchar(128) DEFAULT NULL COMMENT '变更机器IP',
`date` datetime NOT NULL COMMENT '变更时间',
`user` varchar(45) NOT NULL COMMENT '变更用户',
`alt_group` varchar(45) DEFAULT NULL COMMENT '变更组别',
`content` longtext NOT NULL COMMENT '变更内容',
`url` varchar(200) DEFAULT NULL COMMENT '变更链接',
`status` tinyint(4) DEFAULT '0' COMMENT '变更状态',
`creation_date` datetime NOT NULL COMMENT '数据库创建时间',
PRIMARY KEY (`id`),
KEY `ind_date_domain_host` (`date`,`domain`,`hostname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='变更表';
CREATE TABLE `alert` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`domain` varchar(128) NOT NULL COMMENT '告警项目',
`alert_time` datetime NOT NULL COMMENT '告警时间',
`category` varchar(64) NOT NULL COMMENT '告警分类:network/business/system/exception -alert',
`type` varchar(64) NOT NULL COMMENT '告警类型:error/warning',
`content` longtext NOT NULL COMMENT '告警内容',
`metric` varchar(128) NOT NULL COMMENT '告警指标',
`creation_date` datetime NOT NULL COMMENT '数据插入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储告警信息';
CREATE TABLE `alert_summary` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`domain` varchar(128) NOT NULL COMMENT '告警项目',
`alert_time` datetime NOT NULL COMMENT '告警时间',
`content` longtext NOT NULL COMMENT '统一告警内容',
`creation_date` datetime NOT NULL COMMENT '数据插入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='统一告警信息';
CREATE TABLE `operation` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`user` varchar(128) NOT NULL COMMENT '用户名',
`module` varchar(128) NOT NULL COMMENT '模块',
`operation` varchar(128) NOT NULL COMMENT '操作',
`time` datetime NOT NULL COMMENT '修改时间',
`content` longtext NOT NULL COMMENT '修改内容',
`creation_date` datetime NOT NULL COMMENT '数据插入时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户操作日志';
CREATE TABLE `overload` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`report_id` int(11) NOT NULL COMMENT '报告id',
`report_type` tinyint(4) NOT NULL COMMENT '报告类型 1:hourly 2:daily 3:weekly 4:monthly',
`report_size` double NOT NULL COMMENT '报告大小 单位MB',
`period` datetime NOT NULL COMMENT '报表时间',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `period` (`period`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='过大容量表';
CREATE TABLE `config_modification` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`user_name` varchar(64) NOT NULL COMMENT '用户名',
`account_name` varchar(64) NOT NULL COMMENT '账户名',
`action_name` varchar(64) NOT NULL COMMENT 'action名',
`argument` longtext COMMENT '参数内容',
`date` datetime NOT NULL COMMENT '修改时间',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置修改记录表';
CREATE TABLE `user_define_rule` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增长ID',
`content` text NOT NULL COMMENT '用户定义规则',
`creation_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户定义规则表';
CREATE TABLE `business_config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '配置名称',
`domain` varchar(50) NOT NULL DEFAULT '' COMMENT '项目',
`content` longtext COMMENT '配置内容',
`updatetime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `updatetime` (`updatetime`),
KEY `name_domain` (`name`,`domain`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `metric_screen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '配置名称',
`graph_name` varchar(50) NOT NULL DEFAULT '' COMMENT 'Graph名称',
`view` varchar(50) NOT NULL DEFAULT '' COMMENT '视角',
`endPoints` longtext NOT NULL,
`measurements` longtext NOT NULL COMMENT '配置的指标',
`content` longtext NOT NULL COMMENT '配置的具体内容',
`creation_date` datetime NOT NULL COMMENT '配置创建时间',
`updatetime` datetime NOT NULL COMMENT '配置修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `name_graph` (`name`,`graph_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统监控的screen配置';
CREATE TABLE `metric_graph` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`graph_id` int(11) NOT NULL COMMENT '大盘ID',
`name` varchar(50) NOT NULL COMMENT '配置ID',
`content` longtext COMMENT '配置的具体内容',
`creation_date` datetime NOT NULL COMMENT '配置创建时间',
`updatetime` datetime NOT NULL COMMENT '配置修改时间',
PRIMARY KEY (`id`),
UNIQUE `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统监控的graph配置';
CREATE TABLE `server_alarm_rule` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category` varchar(50) NOT NULL COMMENT '监控分类',
`endPoint` varchar(200) NOT NULL COMMENT '监控对象ID',
`measurement` varchar(200) NOT NULL COMMENT '监控指标',
`tags` varchar(200) NOT NULL DEFAULT '' COMMENT '监控指标标签',
`content` longtext NOT NULL COMMENT '配置的具体内容',
`type` varchar(20) NOT NULL DEFAULT '' COMMENT '数据聚合方式',
`creator` varchar(100) DEFAULT '' COMMENT '创建人',
`creation_date` datetime NOT NULL COMMENT '配置创建时间',
`updatetime` datetime NOT NULL COMMENT '配置修改时间',
PRIMARY KEY (`id`),
KEY `updatetime` (`updatetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统告警的配置';
(2)一套独立的CAT集群只需要一个数据库;
(3)数据库编码使用utf8mb4,否则可能造成中文乱码等问题;
2.服务端部署
(1)下载Tomcat服务器,如:https://tomcat.apache.org/download-80.cgi
(2)下载cat.war包,由于依赖问题,个人建议直接下载官网打好包的cat-home-3.0.0.war,然后重命名为cat.war,下载地址:http://unidal.org/nexus/service/local/repositories/releases/content/com/dianping/cat/cat-home/3.0.0/cat-home-3.0.0.war
(3)将cat.war放到解压后的Tomcat的webapps目录下
3.服务端配置
(1)创建相关目录并赋权限,并在/data/appdatas/cat目录下新建client.xml,server.xml,datasources.xml配置文件
mkdir -p /data/{appdatas,applogs}/cat
chmod -R 777 /data
(2)datasources.xml
1 <?xml version="1.0" encoding="utf-8"?>
2
3 <data-sources>
4 <data-source id="cat">
5 <maximum-pool-size>3</maximum-pool-size>
6 <connection-timeout>1s</connection-timeout>
7 <idle-timeout>10m</idle-timeout>
8 <statement-cache-size>1000</statement-cache-size>
9 <properties>
10 <driver>com.mysql.jdbc.Driver</driver>
11 <url><![CDATA[jdbc:mysql://192.168.0.1:3306/cat]]></url> <!-- 请替换为真实数据库URL及Port -->
12 <user>test</user>
13 <password>test</password>
14 <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
15 </properties>
16 </data-source>
17 </data-sources>
(3)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">
<!--将172.16.90.114修改为部署CAT的内网IP,请不要写127.0.0.1和外网IP -->
<remote-servers>10.223.123.221:8080</remote-servers>
</console>
</config>
(4)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>
<!-- ip:部署CAT应用的服务器IP
port:CAT服务端接收客户端数据的端口(不允许更改)
http-port:CAT应用部署到的容器的端口(tomcat的端口)
<servers>
<server ip="192.168.126.101" port="2280" http-port="8080" />
<server ip="192.168.126.102" port="2280" http-port="8080" />
<server ip="192.168.126.103" port="2280" http-port="8080" />
</servers>
-->
<server ip="10.223.123.221" port="2280" http-port="8080" />
</servers>
</config>
4.重算客户端路由
(1)启动Tomcat,访问http://10.223.123.221:8080/cat/s/config?op=routerConfigUpdate
<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="部署CAT的服务器内网ip" backup-server-port="2280">
<default-server id="部署CAT的服务器内网ip" weight="1.0" port="2280" enable="true"/>
<network-policy id="default" title="默认" block="false" server-group="default_group">
</network-policy>
</router-config>
点击提交按钮,然后点击重算路由按钮,就绪后重启Tomcat即可(测试不重启Tomcat也能生效)
访问http://10.223.123.221:8080/cat/r,如果显示下图则表示服务端部署成功
如果显示“有问题的CAT服务器[ip]”,请核查一下配置文件以及客户端路由中,都修改为内网ip。
5.客户端springboot集成
(1)在项目的同一个盘符下创建client.xml配置文件和日志目录,文件结构与服务端一致即可,ip改为cat服务端对应的IP,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
<servers>
<!-- ip:部署CAT应用的服务器IP
port:CAT服务端接收客户端数据的端口(不允许更改)
http-port:CAT应用部署到的容器的端口(tomcat的端口)
<servers>
<server ip="192.168.126.101" port="2280" http-port="8080" />
<server ip="192.168.126.102" port="2280" http-port="8080" />
<server ip="192.168.126.103" port="2280" http-port="8080" />
</servers>
-->
<server ip="10.223.123.221" port="2280" http-port="8080" />
</servers>
</config>
(2)下载cat-client依赖包,安装到本地maven仓库:
先打开该网址:https://mvnrepository.com/artifact/com.dianping.cat/cat-client/3.0.0===》http://unidal.org/nexus/content/repositories/releases/然后即可下载需要的jar包
本人在测试过程中,发现maven依赖的方式下载不下来,固直接下载jar包下来安装到本地仓库:http://unidal.org/nexus/content/repositories/releases/com/dianping/cat/cat-client/3.0.0/cat-client-3.0.0.jar
需要下载如下图cat-client-3.0.0.jar,cat-core-3.0.0.jar按理说可以不要,我做测试的时候安装了,应该没有影响:
执行命令安装:mvn install:install-file -Dfile=cat-client-3.0.0.jar -DgroupId=com.dianping.cat -DartifactId=cat-client -Dversion=3.0.0 -Dpackaging=jar
这样就能在springboot项目中进行依赖了。
(3)项目配置和埋点
1 public List<UrlModel> fetchUrls(int limitCount, Set<Long> taskIds) {
2 Transaction t = Cat.newTransaction("DistributedSpiderApiImpl", "fetchUrls");
3 Event event = Cat.newEvent("fetchUrlsEvent", "fetchUrlsQPS");
4 List<UrlModel> urlModelList = null;
5 try {
6 urlModelList = businessCode(limitCount, taskIds);
7 event.setSuccessStatus();
8 t.setStatus(Transaction.SUCCESS);
9 } catch (Exception e) {
10 event.setStatus("False");
11 t.setStatus(e);
12 Cat.logError(e);
13 } finally {
14 event.complete();
15 t.complete();
16 }
17 return urlModelList;
18 }
看看效果:
6.集群搭建
(1)配置文件都改为集群的配置,共用一个mysql,datasources.xml文件每个集群机器都要放一份;
(2)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>10.126.0.119:8080,10.126.0.120:8080,10.126.0.130:8080</remote-servers>
</console>
</config>
(3)client.xml
<?xml version="1.0" encoding="utf-8"?>
<config mode="client"
xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
<!-- ip:部署CAT应用的服务器IP
port:CAT服务端接收客户端数据的端口(不允许更改)
http-port:CAT应用部署到的容器的端口(tomcat的端口)-->
<servers>
<server ip="10.126.0.119" port="2280" http-port="8080" />
<server ip="10.126.0.120" port="2280" http-port="8080" />
<server ip="10.126.0.130" port="2280" http-port="8080" />
</servers>
</config>
(4)客户端路由配置
<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="10.126.0.119" backup-server-port="2280">
<default-server id="10.126.0.119" weight="1.0" port="2280" enable="false"/>
<default-server id="10.126.0.120" weight="1.0" port="2280" enable="true"/>
<default-server id="10.126.0.130" weight="1.0" port="2280" enable="true"/>
<network-policy id="default" title="default" block="false" server-group="default_group"></network-policy>
<server-group id="default_group" title="default-group">
<group-server id="10.126.0.120"/>
<group-server id="10.126.0.130"/>
</server-group>
</router-config>
(5)服务端配置,主要是配置remote-servers : 定义HTTP服务列表,(远程监听端同步更新服务端信息即取此值)http://10.126.0.130:8080/cat/s/config?op=serverConfigUpdate
<?xml version="1.0" encoding="utf-8"?>
<server-config>
<server id="default">
<properties>
<property name="local-mode" value="false"/>
<property name="job-machine" value="false"/>
<property name="send-machine" value="false"/>
<property name="alarm-machine" value="false"/>
<property name="hdfs-enabled" value="false"/>
<property name="remote-servers" value="10.126.0.119:8080,10.126.0.120:8080,10.126.0.130:8080"/>
</properties>
<storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="2" local-logivew-storage-time="1" har-mode="true" upload-thread="5">
<hdfs id="dump" max-size="128M" server-uri="hdfs://127.0.0.1/" base-dir="/user/cat/dump"/>
<harfs id="dump" max-size="128M" server-uri="har://127.0.0.1/" base-dir="/user/cat/dump"/>
<properties>
<property name="hadoop.security.authentication" value="false"/>
<property name="dfs.namenode.kerberos.principal" value="hadoop/dev80.hadoop@testserver.com"/>
<property name="dfs.cat.kerberos.principal" value="cat@testserver.com"/>
<property name="dfs.cat.keytab.file" value="/data/appdatas/cat/cat.keytab"/>
<property name="java.security.krb5.realm" value="value1"/>
<property name="java.security.krb5.kdc" value="value2"/>
</properties>
</storage>
<consumer>
<long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
<domain name="cat" url-threshold="500" sql-threshold="500"/>
<domain name="OpenPlatformWeb" url-threshold="100" sql-threshold="500"/>
</long-config>
</consumer>
</server>
<server id="10.126.0.119">
<properties>
<property name="job-machine" value="true"/>
<property name="send-machine" value="true"/>
<property name="alarm-machine" value="true"/>
</properties>
</server>
</server-config>
集群效果图如下:
cat-client配置
1 被监控的三方应用所在的服务器上配置如下内容:
mkdir /data/applogs/cat
mkdir /data/appdatas/cat
2在此目录创建 client.xml
// /data/appdatas/cat/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>
// ip 为监控服务端cat-home 地址
// http-port 为监控服务端cat-home 端口
// port2280 为固定值 ,jetty端口
3 引入 cat-client.xxx.jar
包 【坑!!】
若从maven repository上下载的 `cat-client.jar ` 包,
很有可能会报` 未找到 ModeContext异常 `,
所以一定要注意使用github下载的源码编译cat工程:
git clone https://github.com/dianping/cat.git
mvn clean install -DskipTests
到 \cat\cat-client\target
目录 或者 D:\workspace\java\cat\lib\java\jar
把 cat-client-3.0.0.jar
安装到本地maven仓库或工程
mvn install:install-file -Dfile=cat-client-3.0.0.jar -DgroupId=com.dianping.cat -DartifactId=cat-
client -Dversion=3.0.0 -Dpackaging=jar
官方文档通知 :
- 根目录下 cat-client 模块以后不再维护,下个大版本更新计划移除。新版Java客户端参考:lib/java
- 管理端、服务端、告警服务均使用 cat-home 模块部署即可
4cat-client部署步骤
假设工程启动时模块名application-context设置为:nic,即/nic/***
在工程的resources
下创建META-INF
|--resources
--META-INF
--cat
--client.xml
--app.properties
其中,client.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<config mode="client">
<domain id="nic"/>
</config>
// mode=client 客户端
// <domain id="nic"/> 要监控的应用的domain 为 nic,CAT后台 会自动添加一个名为
// nic的 transaction
app.properties
配置如下:
app.name=nic
// 此需要监控的应用的名字为nic,需要与上文 <domain id="nic"/> 中的id一致
5配置埋点
拦截器模式配置:
public class CatInterceptor implements HandlerInterceptor {
Logger logger = LoggerFactory.getLogger(CatInterceptor.class);
private ThreadLocal<Transaction> tranLocal = new ThreadLocal<Transaction>();
private ThreadLocal<Transaction> pageLocal = new ThreadLocal<Transaction>();
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String uri = httpServletRequest.getRequestURI();
Transaction transaction = Cat.newTransaction("URL", uri);
Cat.logEvent("URL.Method", httpServletRequest.getMethod(), Message.SUCCESS, httpServletRequest.getRequestURL().toString());
Cat.logEvent("URL.Host", httpServletRequest.getRemoteHost(), Message.SUCCESS, httpServletRequest.getRemoteHost());
tranLocal.set(transaction);
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
String viewName = modelAndView != null ? modelAndView.getViewName() : "NONE";
Transaction transaction = Cat.newTransaction("view", viewName);
pageLocal.set(transaction);
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
Transaction pt = pageLocal.get();
pt.setStatus(Transaction.SUCCESS);
pt.complete();
Transaction t = tranLocal.get();
t.setStatus(Transaction.SUCCESS);
t.complete();
}
}
6 spring-web.xml中添加拦截器
<!--添加拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="org.seckill.interceptor.CatInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
7 cat-home 与 cat-client配置在同一服务器上的步骤
cat-home 与 cat-client可以共用 /data/appdatas/cat
cat-client只需要在 /data/appdatas/cat下配置client.xml即可,如果已配置不需要再重复配置
Cat Client for Java
https://github.com/zml525/cat/tree/v3.0.0/lib/java
Cat Java 客户端支持 JDK 1.6 及以上版本
安装
通过 Maven 添加依赖
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId>
<version>${cat.version}</version>
</dependency>
直接引入jar包
如果没有使用maven管理依赖,可以直接复制 jar/cat-client-3.0.0.jar 到项目 WEB_INF/lib 路径下。
初始化
一些准备工作需要在初始化 cat client 之前完成。
然后你需要在你的项目中创建 src/main/resources/META-INF/app.properties 文件, 并添加如下内容:
app.name={appkey}
appkey 只能包含英文字母 (a-z, A-Z)、数字 (0-9)、下划线 (_) 和中划线 (-)
现在java的cat client会自动懒加载,已经没有必要手动初始化客户端。
Quickstart