CAT(Central Application Tracking),是基于纯Java开发的分布式实时监控系统。开源代码托管在GitHub(搜索CAT即可),作者是吴其敏(qmwu2000,目前在平安任职)和尤勇(youyong205 目前在点评运维部)。CAT采用非常开放的Apache License开源,在国内已经有100多家互联网公司在使用和评估,包括大众点评网、携程网、猎聘网、陆金所和找钢网等。截至2019年4月,CAT已经获得近9000个stars。

CAT在分布式实时方面,主要归结于以下几点因素:

  • 去中心化,数据分区处理。
  • 基于日志只读特性,以一个小时为时间窗口,实时报表基于内存建模和分析,历史报表通过聚合完成。
  • 基于内存队列,全面异步化,单线程化,无锁设计。
  • 全局消息ID,数据本地化生产,集中式存储。
  • 组件化、服务化理念。

1、功能模块

  • cat-client: 客户端,上报监控数据
  • cat-consumer: 服务端,收集监控数据进行统计分析,构建丰富的统计报表
  • cat-alarm: 实时告警,提供报表指标的监控告警
  • cat-hadoop: 数据存储,logview 存储至 Hdfs
  • cat-home: 管理端,报表展示、配置管理等

2、设计思想

CAT架构图(cat-client、cat-consumer、cat-home),https://github.com/dianping/cat/wiki/overall。

客户端设计(ThreadLocal、异步内存队列、api设计、自定义序列化协议、Netty、CPU消耗、内存泄露),https://github.com/dianping/cat/wiki/client

服务端设计(netty、hdfs文件服务器),https://github.com/dianping/cat/wiki/server

模型设计
1)监控模型

  • Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数Event 用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小
  • Heartbeat 表示程序内定期产生的统计信息, 如CPU利用率, 内存利用率, 连接池状态, 系统负载等
  • Metric 用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟

2)消息树
CAT监控系统将每次URL、Service的请求内部执行情况都封装为一个完整的消息树、消息树可能包括Transaction、Event、Heartbeat、Metric等信息详细见官方文档:https://github.com/dianping/cat/wiki/model

3、服务端操作
1)集群部署见文档

2)报表介绍:具体使用时可以查阅

3)配置手册:具体使用时查阅
CAT主要提供以下三种配置:

  • 项目配置 包括项目基本信息、机器分组配置
  • 告警配置 包括基本告警配置、告警规则、以及具体告警配置
  • 全局配置 包括服务端配置、消息采样配置、客户端路由
  • 业务指标 包括业务监控配置、业务标签配置

4、Java客户端
这里以maven项目示例,jdk版本需1.6以上
注:聚合了log4j规范和log4j2、logback日志系统
1)引入依赖

<dependency>
    <groupId>com.dianping.cat</groupId>
    <artifactId>cat-client</artifactId>
    <version>${cat.version}</version>
</dependency>

2)在项目resources文件下建立/META-INF/app.properties文件
内容是:

app.name={appkey}

3)埋点

Transaction t = Cat.newTransaction("URL", "pageName");

try {
    Cat.logEvent("URL.Server", "serverIp", Event.SUCCESS, "ip=${serverIp}");
    Cat.logMetricForCount("metric.key");
    Cat.logMetricForDuration("metric.key", 5);

    yourBusiness();

    t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
    t.setStatus(e);
    Cat.logError(e);
} finally {
    t.complete();
}

版权声明:本文为weixin_40682142原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_40682142/article/details/89526433