Cat

客户端agent:CatClientModule初始化,StatusUpdateTask不断HeartBeat上报
Message - Transaction和Event/Trace/HeartBeat/Metric (无tags,含status和data字符串),不像etrace内Metric和Trace分离,Metric有各种类型,每种类型field数量类型不同
MessageTree包含以上五种,Stack为空发出(即单发非Transaction的Message会立即发出),占一个messageId

获取服务端地址:轮询某服务端,服务端含所有地址(db+xml),服务端根据请求的domain(appId) hash给出一个地址,再+1给一个backup地址,保证同一domain路由到同一服务端
调用链串联:etrace的rpcId可以表达父子和同级先后,不过child只能关联到父CallStack而不是具体Trace,Cat使用type为RemoteCall的Event来串联
messageId:domain-ip-hour-单机内domain+hour内的seq ,ip和hour都要处理下, 某domain可能既要为自己生成messageId,也要为下游生成messageId

服务端:Cat-Home(war), 含CatServlet(CatHomeModule初始化,TcpSocketReceiver)和MVC(ReportModule为r,SystemModule为s)
TcpSocketReceiver-periodManager - period(小时)- periodTask(queue+thread+analyzer实例)
定义多个analyzer,每个analyzer可能有多实例(analyzer处理慢,多个thread来处理),messageTree分发到每个analyzer/periodTask内(多实例按domain hash选实例)

DumpAnalyzer:存储MessageTree,为每个domain+hour创建索引和数据文件(文件名的ip为服务端ip),每个文件存储多个ip的所有seq对应数据
索引文件:分header和data,
header占据一个segment(segmentId=0,segmentSize/8,2*segmentSize/8 …): 8字节magicCode,接下来数据为ip+segIndex(8byte),根据数据可得Map<ip,<segIndex,segmentId>>
segmentIndex:ip内的segmentNo
segmentId:全局(所有ip)的segmentNo
数据文件:分多block,每个block存储多MessageTree,block是内存里多个MessageTree满足一定条件(大小)后flush
存储/查询流程:根据messageId得到ip,seq,算出segmentIndex,segmentOffset,Map<ip,<segIndex,segmentId>>得到segmentId,得到segment的位置并根据segmentOffset获取blockAddr+blockOffset,最后获取MessageTree

大部分其它Analyzer:从ReportManager找到或创建此小时此domain的相应类型report,提取MessageTree相关信息merge入report
ReportManager用于管理某类报表,内含每小时每个domain的此类型报表,T为具体报表类型,ReportManager含ReportDelegate用于对此类报表的具体操作,如序列化或转为xml进行存储
持久化:period结束,对此period各类型各domain报表持久化到file和db,shutDownHook持久化到file
file:各小时各类型各analyzer实例产生一文件,如20180604/15/1/report-cross,附加一索引文件记录(domainName-此domain在数据文件的offset)
db:各小时各类型各analyzer实例各domain生成两记录
持久化后会立即创建task入库,task有小时,天,星期,月类型,根据报表类型/domain来决定创建哪些类型的task,task是用于合并多机或多机+多时间段的报表,report_type+period+domain+task_type唯一键用于去重
服务端根据server.xml启动时决定是否是任务机,任务机轮询读取数据库task,针对不同报表类型(TaskBuilder)下不同taskType(TaskBuilder的不同方法)进行merge处理然后入库
举例:天类型报表,先获取小时级报表(数据库获取多机的小时报表然后merge),小时级merge形成天级,天级报表入库

TopAnalyzer:所有domain的消息放同一report,统计Error,RuntimeException,Exception的Event,report内按domain/minute统计异常次数等
EventAnalyzer:按domain生成report,内部按ip/type/name/minute统计Event的各类指标,采样messageId
MetricAnalyzer:按productLine生成report,内部按domain/metricName/minute统计Metric
ProblemAnalyzer:按domain生成report,内部按ip区分,交给List处理,统计不成功的Transaction,Event,HeartBeat和耗时长的Transaction
TransactionAnalyzer:按domain生成report,内部按ip/type/name/minute或duration统计各类指标,采样messageId
CrossAnalyzer:调用链分析,按domain生成report,提取type为Call或Service的Transaction和其子Event(没有tag,很多调用的细节信息只能通过子Event来记录)构建CrossInfo,通过CrossInfo更新report(内部按本地ip/远程ip/服务名称进行统计)
StorageAnalyzer:统计数据库/缓存(后面把rpc也加进来了)操作,按缓存类型(redis/memcached)或数据库名生成report,提取特殊类型Transaction和其子Event获取信息,内部按ip(数据库或缓存的ip)/domain/operation(set,get,select,update)/minute进行统计
StateAnalyzer:分析CAT服务器自身异常
HeartbeatAnalyzer:按domain生成report,内部按ip/minute统计,HeartBeat的data包含了各种信息

MVC以http://localhost:8080/cat/r/t请求为例
r/t:r找到ReportModule(t找到某个inbound method,同时t也找到某outbound method,inbound method上的annoations同时定义了 transition method,error method,validators,preInbound methods,payload type),payload是queryString解析后的对象,preInbound method list(某preInbound对应的validators环绕+payload解析+可能对应的提前outbound) - inbound(validators环绕+payload解析) - transition - outbound ,异常走error,实际上逻辑基本都在outbound,outbound根据payload的参数,查询数据库,会做些merge等,通过jsp/xml Viewer返回结果

plexus:Ioc容器,加载类路径下META-INF/plexus下的文件
ContainerLoader.getDefaultContainer()
ModuleContext ctx = new DefaultModuleContext(getContainer());
ModuleInitializer initializer = ctx.lookup(ModuleInitializer.class);
initializer.execute(ctx); (不传modules为ModuleManager的顶层modules)
通过dependencies获取所有modules,先子到父setup,后子到父initialize/execute

配置:从db获取,db没有读取xml文件并写入数据库,轮询数据库进行更新
codegen插件:生成实体类(dal-model),生成数据库相关类(dal-jdbc),如ConfigDao,Config,ConfigEntity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值