【生产上线】监控告警体系设计方案
一、系统监控的目的和范围:
1.1 监控的目的
在生产环境中,保证系统服务运行的稳定性、可靠性十分重要。一方面,要求在服务运行过程中,对服务的运行状态、负载情况有时刻的掌握;另一方面在服务中断或者错误报出后,及时告警并发现问题,获取日志、还原问题场景、排除bug;
1.2监控的范围
纵向的监控体系从上往下分为4个层次的监控(最大外延和最小内涵):
第1层:业务级
业务的监控对象包括业务关心的各项指标,例如关键方法执行耗时、每分钟的处理里程等。该部分目前主要通过elk实施。
第2层次:应用/服务级
通过对应用/服务实时负载情况、心跳健康状况、运行时异常错误监控,提前做好预防保持稳定,也有利于bug回溯优化现有程序。
(1)监控内容
我们监控告警的内容有三个方面如下:
第一:应用实时负载状态监控(包含微服务/ml);
第二:应用心跳检测,健康中断检测监控告警;
第三:应用框架日志中运行时ERROR错误监控告警;
(2)Bug现场还原
除了监控告警之外,怎样保存问题现场。如果告警成功,我们的错误日志和恢复场景涉及的中间数据库文件如何获取,在物理隔离的生产环境中如何有效的传递给开发人员做场景恢复的问题,也是需要考虑讨论的。
第3层次:组件级
组件实时运行的负载情况监控;例如redis、pg的实时负载情况;包含进程的进程cpu使用量、内存使用率、GC情况的实时状态;
第4层次:虚拟机物理资源
虚拟机资源和负载情况,CPU、网络、磁盘IO、网络IO情况进行监控,及时掌握对整体资源的利用率。(该部分内容可能是运维人员管理平台的时候自带的监控管理)
其中前三层是我们关注的重点。
二、问题场景
2.1当前监控告警的场景如下:
场景1.对spark streaming (ML/broker)相关:
第一,程序异常掉线时候,获得通知消息给运维人员,并且将相应的错误日志、以及用于恢复环境的数据库文件等down取下来给开发测试人员恢复场景、测试修复bug.
第二,ml程序虽然没退出运行,但是其中仍然有ERROR日志需要修复,需要监控捕获ERROR告警并通知down下来日志文件;
第三,(1)需要对业务日志的业务指标监控(例如特定方法的耗时,超阈值告警等); (2)需要监控业务指标的实时状态,这个kibana是否可以自带dashboard实现。
场景2 针对微服务campaign相关:
也是分为app心跳检测、与错误日志监控。cm特殊的地方在于存在同一个服务多实例的问题,需要确保每个实例都是正常运行的。
场景3 针对目前应用/服务、组件的运行实时负载等状态监控;
(1)例如微服务的运行状态、maplearning的运行负载状态(Spark UI可见);
(2)以及各个组件的状态、例如redis和pg、kafka;
三、初步解决方案
(1)场景1和场景2解决方案
考虑解决方式同样是通过elk日志获取程序发出的不间断的心跳、错误日志关键词ERROR抓取等;设想elasticalert作为告警的关键技术组件;
关于心跳,具体来说,程序/服务中加入定时器不停止的发送心跳消息到kafka(或者使用filebeat获取心跳日志文件),然后通过elk抓取心跳关键词,并统计词频,低于阈值就告警;(nginx的心跳检测机制,需要调研);
关于spark日志框架运行时ERROR错误,通过elk的关键词黑白名单的方式,做出告警;
【其实,中间涉及到接到告警之后,我们的错误日志如何获取的问题,可以展开讨论】
(2)针对场景3解决方案
- 针对服务,已有微服务(influxDB+Grafana)的负载监控(但未做报警);对spark使用Spark UI作为监控;
- 针对组件,采用Promethues+Grafana的技术栈,目前已经完成应用级别的监控构建,组件包含redis、postgresql、kafka、
(3)物理资源健康
其他的像组件宕机监控和节点物理资源监控未做。(可能是四维云平台要做的)。
(4)关于问题追查与恢复现场解决方案
- 关于备份中间状态,初步确定redis/pg采用主从复制的方式,以redis为例,主节点只是提供读写特权,从节点提供只读特权。只有从节点主机所在的特定数据目录开放给开发人员down取使用;
- 关于框架日志(例如spark),可能需要使用filebeat监控meos下的特定日志目录文件(dcos是把所有的日志收集到特定的目录下面?),然后传输到特定的位置备份。
四、总结
(1)针对以上问题,第一需要讨论现在已有解决方案的合理性和可行性;第二,对现有的方案的补充建议;
重点在于四维云平台和我们研发的隔离程度,我们以上的方式是否可以满足上线要求;
(2)目前上线的紧急重点在于:
问题一:如果我们知道了程序出现异常,那么我们怎样拿到异常日志和恢复现场所需要的中间状态数据,包含redis、Pg、kafka等;
问题二: 怎样将框架日志down下来?
系统日志down下来,filebeat从哪里获取是难点(dcos/mesos确定的文件目录在哪里?)。