内容:(1)CAT介绍与部署1.1简介1.2背景介绍1.3 Cat系统特性1.4消息树1.5 CAT服务器部署1.6 CAT客户端Demo (2)CAT服务器初始化2.1 Cat模块2.2 Cat-servlet初始化2.3 plexus - IOC容器2.4模块加载-模型模式2.5 cat-home 设置2.6 TcpSocketReceiver---nettyreactor的应用模式2.7 消息解码(三)CAT客户端原理3.1 Cat客户端部分核心类3.2 消息组织——消息树3.3 客户端初始化3.4 消息产生——压栈3.5 上下文线程局部变量3.6 事务开启3.7 其他类型消息组合3.8 完成消息——出栈3.9 消息发送——排队3.10 消息序列化3.11 MessageId设计(4)服务器端消息分发4.1 分发架构4.2 分析管理器的初始化4.3 消费者和周期管理器的初始化4.4 什么是周期? 4.5 周期性任务-任务队列4.6 消息分发4.7 周期性策略(5) 配置和数据库操作5.1 CAT 配置5.2 代码自动生成5.3 数据库操作5.4 数据库连接管理(6) 消息分析器和报告(1) 6.1 消息分析器构建6.2 TopAnalyzer 6.3 EventAnalyzer - 事件发生次数分析6.4 MetricAnalyzer - 业务分析6.5 ProblemAnalyzer - 异常分析6.6 TransactionAnalyzer - 事务分析(7) 消息分析器和报告(2) 7.1 CrossAnalyzer - 调用链分析7.2 StorageAnalyzer - 数据库/缓存分析7.3 StateAnalyzer - CAT状态分析7.4 HeartbeatAnalyzer - 心跳分析7.5 DumpAnalyzer - 原始消息LogView存储7.6 自定义分析器和报告(8) 报告持久化8.1 周期结束8.2 分析器结束——报表持久化8.3 报表预处理8.4 报表文件存储——重入锁8.5 报表数据库存储8.6 定时任务(九)管理平台MVC框架9.1 Servlet容器和请求生命周期9.2 页面路由初始化9.3 请求处理流程(十)集成与JAVA 框架集成10.1 与Spring MVC 集成10.2 与Spring Boot 集成10.3 与Spring Cloud 集成10.4 与dubbo集成10.5 与MyBatis集成10.6 与Log4j集成(十一)其他语言支持11.1 PHP语言11.2 C++语言11.3 LUA语言11.4 Go语言11.5 Python语言11.6 Node.js语言11.7 Android隐藏点11.8 Object C——IOS隐藏点(12) 报警及监控提醒12.1 短信通知12.2 邮件通知(十三)CAT与实时计算13.1 hadoop模块13.2 Spark实时计算模块简介
CAT是一个实时且近乎完整的监控系统。它专注于监控Java 应用程序。除了与大众点评RPC组件良好集成外,很快将能够与Spring、MyBatis、Dubbo、Log4j等框架结合。将支持PHP、C++、Go等多语言应用,并基本对接美团点评在上海的所有核心应用。目前广泛应用于中间件(MVC、RPC、数据库、缓存等)框架中,为美团点评各业务线提供系统性能指标、健康状态、监控报警等。在微服务监控领域也非常有用。组件集。
在详细了解CAT的整体设计细节后,我们可以很容易地基于CAT扩展自己的监控和数据采集模块。
CAT项目开源地址:GitHub - dianping/cat: CAT作为服务端项目的基础组件,提供Java、C/C++、Node.js、Python、Go等多语言客户端。并已纳入美团点评基础设施中间件。框架(MVC框架、RPC框架、数据库框架、缓存框架等、消息队列、配置系统等)深度集成,为美团点评各业务线提供丰富的系统性能指标、健康状态、实时性警报等
背景介绍
CAT整个产品开发工作从2011年底开始,是Java迁移到大众点评网的核心初始阶段。大众点评App一开始就已经有了核心的基础中间件、RPC组件Pigeon、统一配置组件Lion。整个Java 迁移已经开始投入使用。随着服务化的深入,Java线上整体部署规模逐渐增大,同时也暴露出越来越多的问题。典型的问题包括:
报错较多,特别是核心业务,定位时间较长。异常日志需要在线权限才能登录在线机器进行排查,排查时间较长。一些简单的错误很难定位(当我将在线库配置为Beta 时,我花了一整夜的时间来排除故障)。很多没有解决的问题都怀疑是网络问题(从现在开始,内网的问题真的很少了)。虽然当时也有一些简单的监控工具(比如Zabbix、自研的Hawk系统等),个别工具可能在某些方面有不错的功能,但整体服务水平参差不齐,可扩展性比较弱,而且监控工具之间无法相互通信,这意味着找到问题的根本原因基本上需要在多个系统之间进行切换。有时候真的要靠“性格”才能找到根本原因。恰巧吴启民从eBay加盟大众点评,成为首席架构师。 eBay 的CAL 系统在内部非常成功。天时、地利、人和,我们开始开发大众点评App ——CAT第一代监控系统。
Cat系统的特性
实时处理:信息的价值会随着时间的推移而急剧下降,尤其是在事件处理过程中。全数据:最初的设计目标是收集全数据。完整数据有很多好处。高可用性:所有应用程序都宕机了,但仍然需要对其进行监控并告知发生了什么情况,以实现故障恢复和问题定位。容错性:CAT本身的故障不应该影响业务的正常运行。如果CAT出现故障,应用应该不会受到影响,但监控能力会暂时减弱。高吞吐量:还原真相需要全面的监控测量,需要强大的处理吞吐能力。可扩展:支持分布式、跨IDC部署,监控系统可水平扩展。不保证可靠性:允许消息丢失。这是一个非常重要的权衡。目前,CAT服务器的可靠性可以达到四个九。可靠系统和不可靠系统的设计有很大不同。
CAT支持的监控消息类型包括:
事务适合记录跨系统边界的程序访问行为,例如远程调用、数据库调用等。也适合执行时间较长的业务逻辑监控。事务用于记录一段代码的执行时间和执行次数。事件用于记录事件发生的次数,例如记录系统异常。与事务相比,它缺乏时间统计,并且其开销也比事务小。 Heartbeat代表程序内部定期产生的统计信息,如CPU%、MEM%、连接池状态、系统负载等。Metric用于记录业务指标。指标可以包括记录度量的次数、平均记录和记录总和。业务指标最小统计粒度为1分钟。 Trace用于记录基本的trace信息,类似于log4j的info信息。该信息仅用于查看一些相关信息。
消息树
CAT监控系统将每个URL和Service请求的内部执行封装成一个完整的消息树。消息树可以包括事务、事件、心跳、度量和跟踪信息。每棵消息树通过rootMessageId和parentMessageId串联起来,形成整个调用链。
完整的消息树:
可视化的消息树:
分布式消息树【一台机器调用另外一台机器】:
CAT服务端部署
需要部署在每个CAT集群10.1.1.1、10.1.1.2和10.1.1.3上
注意:此xml只是一个模板,请根据自己的实际情况替换jdbc.url、jdbc.user、jdbc.password的实际值。 app数据库和cat数据配置一样,app库不起作用,这样代码运行时不会报错。
?xml 版本='1.0'编码='utf-8'? data-sourcesdata-source id='cat'maximum-pool-size3/maximum-pool-sizeconnection-timeout1s/connection-timeoutidle-timeout10m/idle-timeoutstatement-cache-size1000/statement-cache-sizepropertiesdrivercom.mysql.jdbc.Driver/driverurl![CDATA[ ${jdbc.url }]]/urluser${jdbc.user}/userpassword${jdbc.password}/passwordconnectionProperties![CDATA[useUnicode=truecharacterEncoding=UTF-8autoReconnect=truesocketTimeout=120000]]/connectionProperties/properties/data-sourcedata-source id='app'maximum-pool-size3/maximum-pool-sizeconnection-timeout1s/connection-timeoutidle-timeout10m/idle-timeoutstatement -cache-size1000/statement-cache-sizepropertiesdrivercom.mysql.jdbc.Driver/driverurl![CDATA[ ${jdbc.url}]]/urluser${jdbc.us er}/userpassword${jdbc.password}/passwordconnectionProperties![CDATA[useUnicode=truecharacterEncoding=UTF-8autoReconnect=truesocketTimeout=120000]]/connectionProperties/properties/data-source/data-sources 配置/data/appdatas/cat/server .xml[服务器配置]
需要部署每个CAT集群10.1.1.1、10.1.1.2和10.1.1.3。
CAT节点共有四个职责
控制台- 提供给业务人员查看数据【默认所有cat节点都可以作为控制台,不可配置】
消费者机——实时接收业务数据,实时处理,提供实时分析报告【所有猫节点默认均可作为消费者机,不可配置】
报警终端——启动报警线程,进行规则匹配,发送报警(目前仅支持单点部署)【可配置】
任务机——做一些离线任务,合并日报、周报、月报等报表【可配置】
在线做多集群部署,比如三台机器:10.1.1.1、10.1.1.2、10.1.1.3
建议选择机器10.1.1.1。它负责控制台、报警终端和任务机的角色。建议配置域名访问CAT。只需配置一台机器10.1.1.1,挂在域名10.1.1.2下即可。 10.1.1.3 负责消费机。处理,这样可以实现有效隔离,任务机、报警等问题不会影响实时数据处理。默认脚本下的server.xml为?xml version='1.0'encoding='utf-8'?config local-mode='false' hdfs-machine='false' job-machine='true'alert-machine='false'storage local-base-dir='/data/appdatas/cat/bucket/' max-hdfs-storage-time='15' local-report-storage-time='7' local-logivew-storage-time='7'hdfs id='logview' max-size='128M' server-uri='hdfs://10.1.77.86/user/cat' base-dir='logview'/hdfs id='转储'最大大小='128M' server-uri='hdfs://10.1.77.86/user/cat' base-dir='dump'/hdfs id='remote' max-size='128M' server-uri='hdfs://10.1.77.86/user /cat' base-dir='remote'//存储控制台default-domain='Cat' show-cat-domain='true'remote-servers127.0.0.1:8080/remote-servers/console/config 配置说明:
在开发和生产环境中,建议将local-mode : 设置为false。
hdfs-machine : 定义是否启用HDFS存储,默认为false
job-machine : 定义当前服务是否为报告工作机(启用生成汇总报告和统计报告的任务,只需要一台服务器机器即可启用此功能),默认为false
alert-machine : 定义当前服务是否为报警机(开启各种报警监控,只需要一台服务器机器即可开启该功能),默认为false;
storage : 定义数据存储配置信息
local-report-storage-time : 定义本地报表文件的存储时间,单位为(天)
local-logivew-storage-time : 定义本地日志文件的存储时间,单位为(天)
local-base-dir : 定义本地数据存储目录。建议直接使用/data/appdatas/cat/bucket目录。
hdfs : 定义HDFS配置信息
server-uri : 定义HDFS服务地址
console : 定义服务控制台信息
remote-servers : 定义HTTP服务列表(远程监听端同步更新服务器信息时取该值)
ldap : 定义LDAP配置信息(可以忽略)
ldapUrl : 定义LDAP服务地址(这个可以忽略)
重启tomcat前请调用当前tomcat存储数据链接http://${ip}:8080/cat/r/home?op=checkpoint。重启后数据会恢复。 【注意重启时间为每小时整点10-55分钟之间】
在线部署时,建议将此链接调用存储在tomcat的stop脚本中,这样就不需要每次都手动调用。
开发环境CAT的部署
1. 请按上述部署/data/environment目录,并配置数据库配置文件client.xml、datasources.xml和server.xml。注意server.xml中的节点角色,包括job-machinealert-machine。配置为true 2.在cat目录eclipse:eclipse中执行mvn,这一步会生成一些代码文件。如果直接导入到项目中,会发现找不到该类。 3、将源代码作为普通项目导入到eclipse中。注意不要将项目作为maven项目导入。 4.运行com.dianping.cat.TestServer。类,就可以启动cat服务器了5.这个和集群版本唯一的区别是服务器部署单节点,client.xml server.xml和路由地址可以配置为单节点。
CAT客户端Demo
cat客户端的配置:
cat客户端还需要配置/data目录。 /data/目录的具体读写权限请参考上一节。然后通过maven引入cat客户端包,在pom.xml中添加:
依赖groupIdcom.dianping.cat/groupId artifactIdcat-core/artifactId version2.0.0/version/dependency 依赖groupIdcom.dianping.cat/groupId artifactIdcat-client/artifactId version2.0.0/version/dependency 引入后:
上述配置将通过maven从网上导入cat-core和cat-client包。如果无法配置导入,也可以手动导入cat-client.jar包。
默认情况下,CAT 将使用/data/appdatas/cat 作为CAT 主目录。这个目录非常重要。 CAT 客户端配置文件client.xml 位于此目录中。当然,如果是在windows下调试,也可以使用src 在/main/resources/目录下新建META-INF/cat目录,将client.xml配置文件放入src/main/resources/META- INF/cat 目录中,可以配置你的监控的域名,也就是项目名称,如下:domain id='translate'/。
?xml 版本='1.0'编码='utf-8'?配置模式='客户端'xmlns:xsi='http://www.w3.org/2001/XMLSchema'xsi:noNamespaceSchemaLocation='config.xsd'域id='翻译'/服务器! -- 本地开发模式-- server ip='127.0.0.1' port='2280' http-port='8080'/!-- 如果是生产环境,则将实际的服务器地址作为列表。 -- !-- server ip='192.168.7.71' port='2280'/server ip='192.168.7.72' port='2280'/-- /servers/config 第一个监控程序:
一切都已配置完毕。接下来我们来编写第一个监控程序。监控由用户自己完成。当然,在本书的最后,我们将解释CAT监控如何能够更好地与各种流行框架集成。帮助用户实现非侵入式监控埋点。假设我们为用户提供翻译服务,其中之一就是HelloWorld。在下面的程序中,我们将以事务日志的形式记录用户的调用行为:
公共对象helloWorld(HttpServletRequest 请求, HttpServletResponse 响应) { MessageProducer cat=Cat.getProducer();事务t=cat.newTransaction('URL', '翻译/HelloWorld'); //type=URL交易记录: 你的接口/方法名称try{ //做你的事t.setStatus(Message.SUCCESS); } catch (Exception e) { Cat.getProducer().logError(e); t.setStatus(e); } 最后{ t.complete(); } return null;}好,我们去管理平台看看报表信息Transaction 交易报表中,有3 笔type=URL 的交易。我们通常使用URL类型的事务消息来标记接口服务的开始。展开后我们看到调用了项目提供的3个服务。其中包括我们的Translate/HelloWorld:
然后在某个界面点击【:show:】即可进入详细的统计信息,包括耗时分布、每分钟数据量、服务集群中每台机器的统计信息。我们可以用它来查看某台机器是否有问题:
点击LogView可进入最新事务的原始日志(只有问题报告才会记录所有原始日志):
接下来我们看一个更复杂的情况,涉及服务调用、数据库和缓存调用,如下:
标签:
用户评论
看了这篇文章,对CAT有了更深入的了解,部署步骤也很详细,实用!希望后续能多分享一些实际应用案例。
有7位网友表示赞同!
第一次听说CAT,这篇文章介绍得很清晰,部署过程也有图解,学到了不少新知识。
有16位网友表示赞同!
文章中提到的CAT跨语言服务监控功能,对于我们这种做多语言项目的团队来说太有必要了。
有5位网友表示赞同!
部署部分感觉有些复杂,能不能详细解释一下每个步骤的具体作用?
有12位网友表示赞同!
文章开头对CAT的介绍很有意思,但是对于新手来说,还是希望看到更详细的入门教程。
有14位网友表示赞同!
CAT的功能介绍得很全面,但是感觉在实际使用中,可能还需要根据具体情况进行调整。
有17位网友表示赞同!
这篇文章让我对CAT有了全新的认识,特别是监控跨语言服务这一点,太实用了。
有7位网友表示赞同!
部署步骤有点多,希望作者能出一个视频教程,这样更直观易懂。
有6位网友表示赞同!
CAT听起来很强大,但是我在实际操作中遇到了一些问题,希望作者能解答。
有8位网友表示赞同!
这篇文章让我对CAT有了更深的理解,但是感觉作者在介绍时可以加入一些实际案例。
有10位网友表示赞同!
CAT的功能确实很强大,但是部署过程对于新手来说可能有些难度。
有5位网友表示赞同!
文章中的图解非常清晰,对于理解CAT的工作原理有很大帮助。
有12位网友表示赞同!
CAT的介绍部分很详细,但是在部署时,我遇到了一些兼容性问题,希望有经验的朋友能帮忙解答。
有11位网友表示赞同!
这篇文章让我对CAT有了更全面的了解,特别是监控跨语言服务这一点,解决了我的一个大难题。
有19位网友表示赞同!
部署步骤虽然复杂,但是按照文章一步步操作,终于成功了,感谢作者!
有13位网友表示赞同!
CAT的功能很强大,但是在实际应用中,我担心其性能和稳定性。
有16位网友表示赞同!
这篇文章让我对CAT有了全新的认识,希望作者能继续分享更多相关内容。
有17位网友表示赞同!
部署过程虽然有点繁琐,但是成功后,感觉CAT的监控效果真的很不错。
有13位网友表示赞同!
CAT的介绍很全面,但是在实际操作中,我还是有很多疑问,希望作者能进一步解答。
有11位网友表示赞同!