资讯专栏INFORMATION COLUMN

CAT之Client端源码分析(1)

liangdas / 1340人阅读

摘要:基本功能介绍是基于开发的业务监控,异常监控的分布式监控平台。主要功能是管理消息的发送,类消息的归集,等消息的管理工作。在中,使用了类型作为当前线程消息管理的上下文,通过这个对象线程安全地实现消息的添加,合并,发送等等。消息传输层以及以及。

Cat基本功能介绍

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

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

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

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

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

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

Trace 用于记录基本的trace信息

Cat Client 主要类介绍

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

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

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

接口层

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

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

消息处理层

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

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到消息传输层中

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66630.html

相关文章

  • 【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操作

    摘要:之后,存储端矿工节点会在一定时间间隔可配置,默认为秒自动启动密封过程,即获取之前微支付通道中暂存区域的所有数据,并将其密封到矿工的承诺存储区域中。 欢迎大家来到第四章,经过前章 【Filecoin源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作的内容阅读后,我们应该会对Filecoin市场机制中的矿工对象有了更详细的认知,对矿工事务的生命周期有了具象化地理解。 本章,我们将重...

    isaced 评论0 收藏0
  • 笃行杂记Zookeeper SessionTimeOut分析

    摘要:前言本文为笃行日常工作记录,烂笔头系列。最终通过分析源码了解到最终的确定是一个协商的过程,而不是简单的配置生效。根据客户端上报的和服务端自身的。如果上报的小于则设置为如果上报的大于则设置为如果介于两则之间,则以上报的时间为准。 0.前言 本文为笃行日常工作记录,烂笔头系列。 源码前面,了无秘密 — by 侯杰 近期的一个C++项目里使用了Zookeeper做服务发现,期间遇到了Sess...

    mcterry 评论0 收藏0
  • Kubernetes监控Heapster源码分析

    摘要:源码版本简介是下的一个监控项目,用于进行容器集群的监控和性能分析。基本的功能及概念介绍可以回顾我之前的一篇文章监控之介绍。在源码分析之前我们先介绍的实现流程,由上图可以看出会从各个上获取相关的监控信息,然后进行汇总发送给后台数据库。 源码版本 heapster version: release-1.2 简介 Heapster是Kubernetes下的一个监控项目,用于进行容器集群的监控...

    gclove 评论0 收藏0

发表评论

0条评论

liangdas

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<