CAT之Client端源码分析(1)

Cat基本功能介绍

CAT是基于JAVA开发的业务监控,异常监控的分布式监控平台。

CAT可以提供以下几种模型的监控:

  • Transaction 适用于记录程序跨系统边界进行的访问行为,比如远程调用,数据库调用,长时间的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。

  • Event 适用于记录事件的发生,比如系统异常的记录,相比于Transaction缺少时间的统计

  • Heartbeat 适用于记录程序内定期产生的统计信息,如CPU,MEM,连接池状态,系统负载等

  • Metric 用于记录业务指标,包含对一个指标记录次数或其他统计

  • Trace 用于记录基本的trace信息

Cat Client 主要类介绍

Client的主要入口是cat-client包中的Cat类

Cat类以及Cat的依赖类层级结构如下

cat_analyze

从图中可以看出,Cat client从上到下总共分为三层

接口层

Cat类以及CatProducer类。主要功能是为外部提供api,Cat主要作用是与plexus框架做集成,CatProducer是处理api的主要类

PS:额外说一下,Cat这个项目很【有特色】地用了plexus作为管理容器,初次接触的时候真是让人头大,plexus的基本功能和spring可以说别无二致,但是很多地方的注入竟然都需要手动处理,真是让人尴尬,虽然作者说spring太重了,plexus的作用已经足够

消息处理层

MessageManager以及其内部类Context。主要功能是管理消息的发送,Transaction类消息的归集,等消息的管理工作。在MessageManager中,使用了ThreadLocal<Context>类型作为当前线程消息管理的上下文,通过这个对象线程安全地实现消息的添加,合并,发送等等。

PS:MessageManager管理的消息Message是基于Cat的监控模型创建的,其中最主要的区别是Transaction类和其他消息不太一样,Transaction消息是一个链表的模型,每一个消息后面都链接着下一个消息,所以MessageManager对Transaction的处理也不同,别的消息都是放到Context中直接从消息处理层flush到下一层,Transaction是放到Context的栈中,直到过了预定时间,或者消息达到规定的最大长度才flush到下一层。

消息传输层

TransportManager以及TcpSocketSender以及ChannelManager。主要功能是把消息管理层发下来的消息进行发送,对于与多个发送的目的服务器进行Channel管理,保证有可用服务器能接受消息。TransportManager主要功能是根据配置文件初始化TcpSocketSender,TcpSocketSender主要实现把Message进行编码(如果是Transaction还会进行合并)并放置到待发送队列中,再同时由ChannelManager消费队列中的消息,将消息发送给状态为active的server端

PS:暂存消息的队列用的是LinkedBlockingQueue,实际上LinkedBlockingQueue属于生产消费者队列的标配了,因为这个类对于添加和移除的消耗小,线程安全,而且达到队列容量时会成为blocking状态,所以基本上都会用这个类,或者基于这个类进行扩展来实现相关需求。相对来说还有ConcurrentLinkedQueue可以用,和blockingqueue的主要区别是,Concurrent超过主要容量会直接返回false,不会block,所以如果想马上就返回的可以用Concurrent队列。

CatClientModule类中的StatusUpdateTask

由于Cat用了十分村的plexus作为容器,所以在加载Cat类的时候会从静态方法中加载各个Module,CatClientModule就是Cat client工程中首要Module

CatClientModule在加载过程中会从StatusUpdateTask中启动一个线程来每隔一段时间发送一个HeartBeatMessage,其中包括了客户端能拿到的各种信息,包括CPU,Memory,Disk等等,开发者也可以通过实现StatusExtension接口的方式来实现对于HeartBeatMessage发送内容的扩展。

其中比较重要的实现信息收集的是这行代码

StatusInfoCollector statusInfoCollector = new StatusInfoCollector(m_statistics, m_jars);
status.accept(statusInfoCollector.setDumpLocked(m_manager.isDumpLocked()));

m_statistics包含的是已经发送过信息的容量,m_jars是通过classLoader加载的jar包名称,StatusInfoCollector通过大量访问者模式的代码实现了将各种指标set到status中的功能,之后将status封装到HeartBeatMessage中,按照一般对于message的处理流程,flush到消息传输层中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值