朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟git
【下载本文PDF进行阅读】github
这里所说的六兄弟只指ELK套件(ElasticSearch+Logstash+Kibana)以及TIG套件(Telegraf+InfluxDb+Grafana)。数据库
上图显示了两套独立的体系,ELK和TIG(TIG是我本身编出来的,网上没有相似于ELK这种约定俗成的说法):数组
这两套体系都由收集器+存储+展现网站构成,青绿色的收集器,蓝绿色的存储,红色的展现网站。缓存
这两套体系都有免费的组件可使用,安装配置也相对简单(固然公司也要赚钱,他们确定都主推Cloud版本,通常也不会用Cloud版本,确定本地部署)。安全
ELK体系更多用于日志类数据的收集、保存、搜索、查看、报警。服务器
TIG体系更多用于各类Metrics指标类数据的收集、保存、查看、报警。网络
对于ELK,因为日志数据量每每较大,而且突发日志激增的状况很广泛,写入索引没有这么快,因此通常会引入Kafka之类的消息队列在以前挡一挡。架构
对于ELK,在进入ES以前数据会有一些过滤解析和额外的报警之类的需求,因此可使用logstash在以前做为一个汇聚处理层,利用丰富的插件作各类处理。可是logstash的性能不是那么高,对资源的消耗很厉害,使用的时候须要注意。并发
上图是Kibana的界面,这里能够看到咱们把微服务各个组件的日志都收集到了ES中,在Kibana上可使用表达式进行各类搜索,最经常使用的就是按照串联微服务整个流程的RequestID或用户的UserID搜索相关日志了。不少公司的开发习惯到服务器上去一台一台搜索日志,好一点会用ansible批量搜索,这样实际上是很是不方便的:
我一直有一个观点,我认为再怎么强调异常都不过度,特别是一直上抛到业务表面的未处理异常以及服务中的系统异常。咱们能够把异常区分为业务逻辑主动产生的能够预先知道是咋回事的业务异常以及没法预先知道的系统异常。对于系统异常每每意味着底层基础设施(如网络、数据库、中间件)等有抖动或故障或是代码中有Bug(即便不是Bug也是逻辑不完善的状况),每个异常,咱们都须要逐一进行排查调查出根本缘由,若是暂时没有时间调查的话,须要记录在案有时间再去调查。对于有些业务量特别大的系统,天天会有几十万的异常,大概有100+以上的状况。最差最差那就作到这几点吧:
作的更好一点甚至咱们能够为每个错误分配一个ID,若是这个错误有机会透传到用户这端,在500页面上不那么明显的地方显示一下这个ID,若是用户截屏反馈问题的话,能够轻易经过这个错误ID在ELK中找到相应错误,一键定位问题。
上图是Grafana的截图,Grafana支持挺多数据源,InfluxDb也是其中的一个数据源,相似于InfluxDb的产品还有Graphite,也是不错的选择。Telegraf是InfluxDb公司的收集数据的Agent套件,会有至关多的插件,这些插件并不复杂,本身也能够经过Python简单编写,就是有点费时间,有现成的么就用,说白了就是从各个中间件暴露出来的Stats接口收集格式化数据而后写入InfluxDb中去。咱们来看看Telegraf支持的插件(图片截取自https://github.com/influxdata/telegraf):
使用这些插件运维或开发本身不须要费什么力气就能够把咱们全部的基础组件都监控起来了。
如文本一开始的架构图所示,除了咱们可使用Telegraf的各类插件来收集各类存储、中间件、系统层面的指标以外,咱们还作了一个MetricsClient小类库,让程序能够把各类打点的数据保存到InfluxDb。其实每一条进入InfluxDb的Measurement记录只是一个事件,有下面这些信息:
以下图咱们能够看到在这个bankservice中,咱们记录了各类异步同步操做的成功、业务异常、系统异常事件,而后在Grafana进行简单的配置,就能够呈现出须要的图了。
对于MetricsClient,能够在代码中手工调用也可使用AOP的方式进行调用,咱们甚至能够为全部方法加上这个关注点,自动收集方法的执行次数、时间、结果(正常、业务异常、系统异常)打点记录到InfluxDb中,而后在Grafana配置本身须要的Dashboard用于监控。
对于RPC框架也是建议框架内部自动整合打点的,保存RPC方法每次执行的状况,细化到方法的粒度配置出一些图表来,在出现事故的时候一键定位到疑似出问题的方法。经过AOP方+RPC框架自动打点其实已经能够覆盖大部分需求了,固然若是咱们在代码中再加一些业务层面的打点就更好了。
若是咱们为每个业务行为,配置两个图,一个是调用量,一个是调用性能,以下图:
那么:
这里推荐的配置方式是根据数据流,从前到后,每个环节配置一下数据处理的数量和性能:
出了问题能够及时定位到出问题的模块,或至少是业务线,会比无头苍蝇好不少(固然,若是咱们没有事先配置本身须要的Dashboard那也是白搭)。Dashboard必定是须要随着业务的迭代不断去维护的,别通过几轮迭代以前的打点早已废弃,到出了问题的时候再看Dashboard全是0调用。
Grafana对接InfluxDb数据源挺好的,可是对接MySQL作一些查询总感受不是特别方便,这里推荐一个开源的系统Metabase,咱们能够方便得保存一些SQL进行作一些业务或监控之类的统计。你可能会说了,这些业务统计是运营关注的,并且咱们由BI,咱们须要本身作这些图表干啥,我想说咱们即便搞技术也最好有一个本身的小业务面板,不是说关注业务量而是能有一个地方让咱们知道业务跑的状况,在关键的时候看一眼判断一下影响范围。
好了,说到这里,你是否已看到了经过这六兄弟,其实咱们打造的是一个立体化的监控体系,分享一个排查问题的几步走方式吧,毕竟在出大问题的时候咱们的时间每每就只有那么几分钟:
有打点、有错误日志、有详细请求日志,还怕定位不到问题?