监控与故障管理(1)
一般有追求的软件公司在业务范围、或团队规模扩大后都会引入所谓的监控系统,用于监控已有系统的运行状态,以支撑各种问题的预测与定位。在web服务领域中,APM(应用性能分析)的使用或者DevOps方式运作已经相当普遍了,例如阿里有鹰眼系统用于支撑其支付淘宝业务,腾讯有bugly支撑微信及各种手游。
谷歌总结其DevOps的实践经验整理成SRE运维解密(2012)。同年,gartner将APM作为一个技术热点详细分析了其商业模型。如今(2019),APM已经是一个近50亿美金的市场。
那么APM或者DevOps与监控、故障管理又是什么关系呢。举个例子。当一个系统只靠一个人就可以开发维护时,确实不需要一个系统专门来采集数据,管理故障,因为靠问题描述与走读代码即可很快找到原因。随着业务的扩展,人员的增加,可能需要多个组件配合才能完成一个功能时,问题就随之而来。当最终用户在某个服务提供的页面操作后没有及时响应,我们如何来定位与修复这个问题。是这个页面js没有响应,还是用户与服务器的连接质量不佳丢包严重,或者是服务器用户量太大,导致过载。如果问题频繁出现势必会导致用户体验的下降,从而损失(用户),而APM就是为了解决复杂系统内潜在的模块问题,模块间问题而产生的。APM作为一种服务,监控一个系统运行的全流程,当发生故障时能够预警,并提供支撑定位的日志信息。
那么一个APM系统应当具有哪些功能与特性呢?
1.监控与收集Metrics
监控点容易添加,系统开销小
2.统计数据展示
清楚明了的展示系统变化趋势,不同角色有不同的展示逻辑
展示逻辑清晰
3.对于异常能够及时预警
能够自动对问题按既定规则进行分级,展示问题发生的过程
预警能自定义
报告能附带上下文,重新组织收集的信息而不是一整包的提供,更不要分散的提供
4.能够与其他系统联动,闭环问题
与问题跟踪系统联动
与客户服务系统联动
与数据挖掘系统联动
与恢复系统联动
虽说都是复杂系统,面向云服务(阿里云)、复杂应用(支付宝微信)或者Android操作系统设计的APM其也会有很大差别。因为系统的角色有差异,承载的业务逻辑有差异,存在的故障模式也有差异。
下面将以AOSP为例,分析谷歌在其中设计的的功能与模块。
监控内容的范围:
1.定义的故障模式事件,如应用无响应、应用崩溃等
2.异常 如被捕获的Exception,硬件故障或调用超时
3.Event 系统运行时的一些关键事件,如应用启动与关闭以及页面切换事件
4.运行属性,如调用接口延时,调用接口次数,CPU使用率,IO,内存使用率等
由于性能功耗等其他条件的限制我们只能在有限的接口设置监控,只能保存有限大小的数据。监控点的设置应当以KPI为牵引。
多种不同的KPI能够方便的组合使用相同的监控点采集的数据。
应当指出的是,我们监控的都是一种预定义的模式,而不是具体的故障。
场景(服务)监控:
一个服务或者一个场景由一系列的步骤组成,任意步骤均可能失败,在失败时我们没法从内部观察这一点。
例如对于亮屏这一操作,我们有一系列的过程日志,只有全部具备才说明任务完成。这样我们就可以在外部实时观测日志流,来了解任务完成的情况。
这里提出场景监控的概念是因为业务与运行实体以及监控方可能不是同一主体,业务需要了解业务在整个系统中的运行情况。
这就需要监控方提供一套通用的方法,让业务尽可能方便的使用。例如statsd中的MetricProducer就可以近似是一种场景监控的组件
监控发现:
业务使用规定的模版或方法能够自动将自身添加到监控列表中,无需多余的配置。例如Watchdog。
分布式监控:
这个概念在云服务上比较常见,例如Zabbix提供两种监控模式
1.Proxy模式,纯事件日志收集转发,不做任何检查操作
2.Node模式,具有完整的检查,预警以及上报功能,上报的对象是父节点。
与云服务场景不同,在终端侧进行监控需要更加考虑性能以及功耗的影响。所以应当尽可能的将处理以及分析移动到云服务侧。
并且从运行实体上看,终端的监控有两个范畴
1.在终端侧运行的服务
汇总所有的监控信息,进行预处理,对模式故障以及用户声称的故障进行上传
可以根据一系列的事件执行一些Action,例如告警合并,告警去重
2.在云侧运行的服务,是对已经过滤过的数据进行二次的处理,可以主要部署统计信息
APM涉及的角色:
开发人员:
AOSP开发,包括各个层次的模块开发,如内核,驱动,服务等
内部应用开发
外部应用开发
一般开发人员关注的是模块强相关的事件,包括
1.当前以及历史版本模块的异常与日志
2.单一故障或异常在版本间的变化
3.接口调用事件,服务响应事件
运营人员:
质量、服务、管理等
运营人员关注与版本强相关的事件,包括
1.版本上各个模块的故障与异常
2.预定义的MTBF
3.最终使用者的评价
不同的角色有着不同的KPI,在使用APM的目的上也不相同。
所以数据可视化要要有不同的逻辑。数据格式要简单,方便导出进而在不同的系统中进行分析。
Comments