应用上线后,访问量越来越大,如何知晓系统的运行状态,并及时得到异常的告警并介入应急处理?相信大家都需要一个完善的监控系统,当然这里说的监控系统,并不是一般的运维监控系统诸如zabbix、Nagios、Cacti等。下面跟大家分享一款应用的监控告警系统-大众点评CAT。
一、基本信息
CAT 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。在美团点评内部深度集成,为各业务线提供系统丰富的性能指标、健康状况、实时告警等。CAT 很大的优势是它是一个实时系统,CAT 大部分系统是分钟级统计。
CAT于2013年12月开源,经过5年多的社区洗礼,稳定性和实用性是毋庸置疑的,同时它部署简单,上手容易,有需要的话可以考虑使用一下。下面对CAT进行更多的介绍。
二、技术架构
CAT整体分为2个核心模块server、client,以及1个管理端admin。client以jar包的形式提供,需要接入业务系统,并在业务系统中做各种埋点。所有的埋点会被上报到server端,在admin中配置一些告警规则后,会分析上报数据,汇总如果触发告警规则,则会生成告警推送到邮件/短信/微信/电话等。
客户端:
客户端会在每个thread维护一份messageTree(一般以Transaction.start开启),每当messageTree构建完成(一般以Transaction.complete结束),不断的扔进上传队列,连接服务端后异步上报。CAT定义了Transaction(某个事件,带成功率)、Event(某个事件)、Problem(程序异常)、Heartbeat(机器信息定时上传)、Business(宏观业务指标数)这几种领域模型,从代码层面到业务层面都提供了监控手段。
由于消息IO走的是异步,所以这里对应用本身的性能影响很有限;另一方面,队列有大小限制(似乎应避免5000条)不会导致占用太多的内存;再者,上传连接服务端也是异步的,服务端挂掉,客户端消息会在内存队列,并不断尝试重连服务端,完全不会影响到应用本身的可用性。
服务端:
服务端在接收到客户端上传的messageTree后,一方面存储,另一方面分析计算。计算都是以项目维度(项目是在业务系统侧进行配置的,一般每个系统固定)进行的,这里就能将不同项目隔离开来并行处理。历史的消息还可以存储到HDFS等海量存储供以后使用。
计算的项目主要产出各项指标:窗口内调用/成功/失败笔数、成功率,响应耗时。分析可以对以上指标进行规则匹配,如最近N分钟成功率低于95%,业务环比下跌20%等。
管理端:
提供可视化的报表/报告,管理端的项目管理、告警管理、集群信息维护等。
三、问题
作为生产环境,一般要求多节点部署,消除单点故障。CAT本身也支持,甚至它将机器扩展成多种角色:控制台、消费机、告警端、任务机。当新机器加入时,并不能互相识别加入,而是需要修改配置文件并逐机重启!
同时,客户端也需要修改配置文件(包含服务端消费机群的xml文件),好在CAT支持启动时从特定地址读取配置文件。
CAT默认的配置文件和日志目录都是/data下,可以通过-DCAT_HOME=/path/to来人为指定。
CAT只是将告警触发回调的口子预留了,但是具体推送邮件/短信/微信等等,都还需要自己来实现。
四、其它
上面介绍到,CAT需要在业务系统接入,并做监控埋点,这样其实对应用侵入是相当大的,新增监控还需要改代码走发布。更smart的方案可能是应用系统打出日志,由监控中心获取到日志,再经过告警规则引擎处理,生成告警并推送。
社区大概目前有2种方案:1是通过ELK套件,将数据采集集中存储,然后通过查询巡检来检查告警规则是否触发;2是通过Kafka和Flink等流式计算,实时检测告警是否触发。然而还未找到现成的解决方案。
我是加瓦,一个专注于Java研发的普通程序员,和您一起开阔视野和探索Java世界,欢迎关注收藏交流探讨,ღ( ´・ᴗ・` )