作为一线程序猿,是否有过类似经历?新接手一个系统,各接口入口流量是多少,又是哪些业务方在调用?系统大量异常报警,如何快速锁定影响范围,恢复故障并定位问题?接口调用超时,究竟是客户端问题还是服务端响应慢,还是网络波动来背锅? 监控的重要性不言而喻,可是接入监控的额外工作又让人望而却步?每天编写代码之余,又要花多少时间定位线上问题?自己负责的系统故障,是否要等调用方反馈才知道?本文分享爱奇艺有关微服务监控的实践和思考。 如文章《爱奇艺视频后台从"单兵作战"到"团队协作"的微服务实践》 所述,2018年爱奇艺信息流技术团队基于Spring Cloud和公司服务云组件,实现了业务系统的全面微服务化。微服务的拆分,一方面提升了服务负责人的ownership,助力业务快速迭代。另一方面,随着微服务的增加,监控成本随之增加,构建简单有效的微服务监控体系的诉求愈发强烈。本文从以下3个方面展开介绍。
经过一年多的野蛮生 长,信息流团队微服务发展快速,人均负责5个微服务以上,为了全面了解每个微服务运行情况,第一时间感知微服务异常,快速定位线上问题,提高运维效率,微服务建设初期我们尝试了多种监控方案。
这个阶段,我们对微服务监控缺少系统的理论认知和实践经验,所以更多是对已有的监控基础设施和框架低成本的整合和适配。
下面分别从日志监控,Hystrix监控,Actuator监控,拨测监控5个方面介绍。
日志监控
基于日志的监控方案,原理如下图,业界技术方案成熟(例ELK),公司也提供了通用解决方案(Venus),容易落地。缺点是,日志监控链路较长,延迟时间大,报警可能不够及时。
很长一段时间Hystrix是服务熔断降级监控的代名词,Spring Cloud应用中使用hystrix极致易用,从低成本埋点,到配置动态调整,再到原生的可视化Dashboard,使用成本都很低。缺点是,指标数据原生没有持久化,二次开发有一定成本。
下图描述基于Hystrix监控的方案。
Actuator端点是Spring Boot应用开发者的最大福利之一,可以零成本了解单实例运行情况。缺点是,同服务多实例指标聚合,指标持久化,指标时序可视化,都需要二次开发。下图描述Actuator端点监控的方案。
对于面向用户的服务,用户所处网络,地域差异性很大,应用本身可用不代表用户可以正常使用服务,这就需要从用户角度,对服务可用性进行定时拨测。
下图描述拨测监控的方案,主要包括微服务实例自发的健康检查和各拨测点定时拨测。
链路监控既可用于调用链路分析,快速定位具体问题,又可用于梳理服务拓扑结构和依赖合理性,是微服务监控必不可少的一环。
我们使用公司服务云提供的日志收集组件Venus(如前所述)和链路跟踪组件Rover(基于Skywalking+Brave)实现该功能。实现方案如下图所示。
其中,接入固定成本表示为引入相应监控而产生的一次性固定投入,包括学习调研,二次开发,集成适配等成本。接入边际成本表示每新增一个微服务或一个监控指标,新产生的开发配置成本。几种监控方案对比和适用场景如下表所示。
监控类型 | 接入固定成本 | 接入边际成本 | 时效性 | 持久化可追溯 | 适用场景 |
---|---|---|---|---|---|
日志监控 | 极低,基于现有日志收集系统 | 中,日志埋点、解析有一定成本 | 秒级,链路长,有时延迟较大 | 日志持久化,可查看历史 | 时效性要求不高的监控;具体问题排查 |
Hystrix监控 | 低,需要部署Hystrix Dashboard | 低,简单配置 | 秒级 | 需二次开发 | 依赖接口实时监控;熔断降级 |
Actuator监控 | 低,需要部署Spring Boot Admin | 无,应用内置 | 秒级 | 需二次开发 | 单实例指标查看 |
拨测监控 | 无,基于公司云拨测服务 | 低,简单配置 | 分钟级,取决于拨测间隔 | 有报警历史 | 面向用户服务可用性定时拨测 |
链路监控 | 中,需要适配各种中间件 | 低,简单配置 | 秒级,依赖日志流 | 可以 | 跨系统调用链路分析 |
如上所述,我们在微服务监控建设初期尝试了多种监控方案,实现了不同场景下的监控需求,也遇到了新的问题。概括起来,有以下几个:
比如,每新增一个监控指标,需要把接入,埋点,可视化,报警,从头来一遍,随着微服务和指标增加,这种重复性工作严重制约了监控体系的推广落地。特别是metrics监控,指标繁杂,维度多变,应用广泛。
为此,建设一套 监控模型统一,接入成本低,可视化集中管理,报警时效性高,监控指标全面 的微服务监控体系势在必行。下面着重介绍信息流监控系统针对metrics监控的实践。
信息流Metrics监控在Prometheus基础上,以构建简单易用的监控系统为目标,对Spring Cloud框架进行适配整合和定制开发。整体结构如上图,我们主要做了以下工作。
监控模型
监控指标是监控系统的基本对象,监控哪些指标,如何定义描述这些指标,是首要解决的问题。我们通过引入指标-维度-数值多维度数据模型,对常用监控指标和维度进行梳理和定义,形成对监控对象的统一描述和共识,为后续实现维度灵活聚合、定义统一的可视化模板和报警模板奠定基础。
通用指标定义:
指标 | 说明 |
---|---|
QPS | 系统每秒处理业务请求量,反应系统的容量 |
TP指标 | TP99、TP95、MEAN等,反应的是系统的时效性 |
错误量 | http错误响应码的次数,方法调用异常次数等,反应系统的错误面 |
资源使用率 | CPU利用率、内存利用率、磁盘利用率等,反应系统资源利用面 |
通用维度定义:
维度 | 说明 |
---|---|
service_name | 服务名,例:Order |
dc | 机房,例:bjdx |
instance | 服务实例,例:1.1.1.1:2222 |
url | 接口API,例:/order/list |
method | 方法签名 |
status | http 响应码 |
定制扩展
自动接入&埋点
前期我们尝试了多种监控方案,发现能够顺利推广落地的,都有一个共同点,就是服务接入监控的成本很低。最好是不要求应用做任何改动,就可以自动接入,享受监控系统带来的便利。为此我们做了以下工作:
很多情况下,需要对某些业务方法耗时进行监控,传统的埋点方式是在方法入口和出口添加监控代码,业务代码侵入高,开发成本高。
如前所述,Prometheus是用PULL模式获取应用埋点数据,但是有的场景下PULL模式并不适用(比如短生命周期的任务),因此我们基于Prometheus提供的Pushgateway组件,实现PUSH模式获取监控埋点数据。
一种应用场景是,实时收集各个服务日志流中的异常信息。我们监听日志采集的Kafka消息,Flink实时解析出服务异常名称,将各个服务产生的异常实时推送到监控系统,并在Grafana上集中展示。基于Pushgateway的异常监控方案及效果图如下。
不同的监控系统,往往会提供不同的可视化方案。分散的可视化,不利于监控数据的集中展示和全局问题分析。我们使用Grafana实现所有微服务,所有指标的集中可视化。
每个微服务使用统一的监控模板,集中展示各服务入口流量、内部方法、JVM等相关指标。Dashboard模板主要包含以下模块:
• 方法监控指标模块
基于前边定义的通用指标和维度,对所有指标配置默认的报警规则,同时支持自定义报警规则和阈值。基于Grafana Web hook将报警通知发送给Alert Manager,Alert Manager对报警进行相同合并、重复过滤、并格式化为统一报警模板后,投递到爱奇艺统一报警平台,业务owner通过统一报警平台完成报警订阅。统一报警方案及报警样例如下图。
以上所述,爱奇艺信息流监控整体方案总结如下。
自下至上包括4层:
监控系统落地1年多,新增服务基本实现零成本100%接入自动埋点、集中可视化和统一报警,业务owner不需要为接入监控做额外工作,就可以享受监控带来的各种便利;系统异常发生后,可以做到秒级收到报警,借助微服务监控大盘,配合链路监控和日志查询,分钟级确认异常影响范围并定位问题,大大减少故障恢复时间,提升运维效率;目前该方案也在多个其他团队推广落地。
本文介绍了爱奇艺信息流团队微服务监控的探索和实践,涵盖了日志监控,Hystrix监控,拨测监控,链路监控,Prometheus监控等,从最初的多种监控方案兼容并包,到基于多维度数据模型和集中可视化的定制开发。不能简单说,后面的监控方案比前期的好,而是在微服务监控不同发展阶段,监控体系建设投入和收益的折中选择。下面是微服务监控探索过程中一些心得。
以上是监控实践的阶段性探索实践总结,未来还有很多方面需要持续的优化和改进,例如灵活的报警规则,恰如其分的报警,更低成本的埋点、可视化,服务质量评测报告等。另外,依托大数据分析和人工智能能力,系统异常检测,根因分析,智能合并,故障预测和自恢复技术愈发成熟,推动AI赋能数字化运维落地也是我们努力的方向。
领取专属 10元无门槛券
私享最新 技术干货