目录
一、整体介绍
1.1 设计理念
Cat客户端设计理念主要考虑如下几点
- 对业务低影响、对业务低影响、对业务低影响
1.2 整体流程
具体步骤
- 业务线程埋点,生产消息,交给消息生产器Producer
- 消息生产者将消息放入当前线程的消息栈中
- 业务线程在消息构建结束时,将消息栈产生消息树放入消息队列中
- 消息发送者线程将消息队列中的消息树序列化为消息报文上传给Cat服务端
1.3 客户端配置
默认cat的配置文件为/data/appdatas/cat/client.xml 这个配置里面记录了集中的cat配置。
cat通过这个里面的配置地址向服务端发送请求,或者真正的路由CAT路由地址
1.4 MessageId的设计
由四段组成
CAT消息的Message-ID格式domain-0a2b4266-437960-8680,CAT消息一共分为四段:
第一段是应用名:domain。
第二段是当前这台机器的IP的16进制格式:0a2b4266
第三段是系统当前时间除以小时得到的整点数:437960
第四段是表示当前这个客户端在当前小时的顺序递增号(AtomicInteger自增,每小时结束后重置):8680
1.5 MessageTree组成
二、源码解析
2.1 Cat初始化
Cat在做任意打点时,会检测是否初始化,没有初始化再初始化,初始化MessageProducer,MessageManager,启动监视器,发送器,聚合器
2.2 Message代码结构
Cat: Cat门面类,一般直接用此类打点
Message: 消息抽象,有Transaction,Metric,Event,Heartbeat,Trace(已废弃)。Transaction保存了Message列表,可嵌套,其他类型都是原子的
MessageProducer: 封装了所有埋点接口
MessageManager: CAT客户端核心类,消息入出栈
Context: 保存消息上下文信息
TCPSocketSender:负责发送消息
MessageTree:消息树
2.3 几个后台运行线程
Monitor:StatusUpdateTask
(JVM,System,Http,DataSource,Classloader,ETC。。。)
Sender: TcpSocketSender
(MessageQueue,ChannelManager–Netty,IdFactory-CreateMessageId,MessageCodec - 编码消息,run用来消费消息,offer方法是用来添加消息的) 一小时前消息丢弃
2.4 消息创建过程分析
下面以创建Transaction消息为例说明消息创建过程
首先通过消息管理者MassageManager判断是否存在消息上下文context,如果不存在则在setup中创建消息上下文。
start会将消息入栈
如果时间到来,或者长度到了直接截断发送,否则加到子Transaction里
初始化Context时创建消息树,Context属于MessageManager的内部类。可以认为MessageManager的其中一个功能是作为context的一个代理,MessageManager的start、add、end等方法,核心都是调用当前线程context的start、add、end方法。
complete时调用MessageManager的End方法,最后会调用发送。且清除Context信息
其他类型消息
2.5 MessageCodec
消息序列化,反序列化