调用链监控 CAT 之 入门

5次阅读

共计 4784 个字符,预计需要花费 12 分钟才能阅读完成。

简介
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/d… 解压后,数据库的脚本文件为 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/servi…
重命名为 cat.war 进行部署,注意此 war 是用 jdk8,服务端请使用 jdk8 版本
步骤 7:war 部署

将上一步打包的 war 包部署到本机 tomcat 的 webapps 下。
启动 tomcat,打开控制台的 URL,http://127.0.0.1:8080/cat/s/config?op=routerConfigUpdate 默认用户名:admin 默认密码:admin。
配置客户端路由。

<?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-huanchu…
参考
https://github.com/dianping/c…
关注我的公众号,精彩内容不能错过~

正文完
 0