一、前言

在《汽车之家监控系统的第一次里程碑》](http://autohomeops.corpautohome.com/articles/汽车之家监控系统的第一次里程碑/)之后,我们实现了如下几个小Feature

  1. URL监控
  2. 日志监控,并且在告警信息中带上错误日志片段

而后,我们又希望能够实现所谓的“自动故障定位”,来提升问题诊断的效率。

二、思路

我们认为,一个异常问题的发生,必定是有一个或者多个原因导致的,我们用“事件(Event)”来描述这个异常。网站的QPS增大超预期是一个事件,后端接口响应时间变大超预期是一个事件,服务器的CPU-Load增大超预期是一个事件,有人对mysql服务器进行了配置变更是一个事件,有人进行了一次业务代码发布也是一个事件,找出这些事件之间的关系是实现故障定位的关键。

我们理解有两种故障定位的方法

  1. 事件关联分析
  2. 决策树自动推理

我们目前在实践第一种方法。

三、方案

监控指标分类

为了方便进行分析定位,我们对所有采集的监控指标进行了分类

解释

  • 业务层:该层指标反映出Service的质量,如一个订单系统的下单成功率
  • 应用层:该层指标反映出应用软件的运行状态,如Nginx连接数
  • 系统层:该层指标反映出操作系统的运行状态,如平均负载
  • 硬件层:该层指标反映出硬件设备的运行状态,如CPU温度

通过分层,我们将问题分类在我们熟知的范围内。

建立服务树模型

重点是:“服务” 和 “模块”

这两个概念的定义,为下面的模块调用关系奠定了基础。

建立模块调用关系

大写字母代表”服务“,如A服务;小写字母代表”模块“,如a模块;箭头代表调用或者结果返回关系

建立”统一事件库“

我们认为有如下几种确定事件之间关系的方法

  1. 上面的模块调用关系是一种人为定义的确定性关系。
  2. 时间相关性,这是一种非确定性的策略,代表了一种相关可能性。
  3. 事实相关性,通过对大批量历史数据进行分析计算,找到事件之间事实上发生的相关性。

那么,首先我们得需要一个统一的“事件库”来收集所有事件。

我们认为形成事件的来源有这么几个

我们认为一个对象产生异常的影响因素来自于这几个方面

  1. 自身异常,如硬盘损坏
  2. 依赖方异常,如A.b调用了A.c的服务,然而A.c服务异常
  3. 来自外部的对其产生的变更,如开发者对A.b服务进行了代码升级,该服务器所在交换机故障,局方机房网络割接

对于第一点,我们只要将自身的4层指标监控完整,就能够做到可控的程度。 对于第二点,需要我们完整确定每个模块的调用关系。 对于第三点,是我们尤其担心的一点,因为我们很难收集全所有的外部事件,我们使用了如下的方法来尽量实现这个目标。

  • 建立“通告中心”,让人为已知的确定性变更通过这个方式发送出来,并且记录到事件库中。例如对A.b服务进行代码升级。
  • 通过消息队列的Pub/Sub模型建立一个公共的事件总线,让平台里的每个系统都能够将自己产生的重要变更通过这种松耦合的方式对外发布,对该系统的变更感兴趣的其他系统就可以有选择地抓取,如监控系统可以抓取写入事件库。

对于事件总线这块,我们这几个系统的是这样工作的

  1. AutoBank(资源管理系统)会将设备(服务器、交换机等)的状态变化,附加上工单,作为一个事件记录到自己的日志中,同时发布到事件总线里。我在 2016 opsworld - 运维的数据银行 的分享中有提到,状态的变化意味着有变更流程,有变更就有产生风险的可能。
  2. AutoGear(服务管理系统)会直接对服务器上的软件环境产生变更,所以会将哪台服务器上安装了什么软件,或者对什么软件的参数进行了怎么样的修改封装成一个事件记录到自己的日志中,同时发布到事件总线里。
  3. AutoPush(代码发布系统)会在流程上强制要求代码上线人必须先通过“通告中心”发布”上线通告“,这条通告会通过钉钉、邮件或者短信发送给相关人,也会录入事件库,然后AutoPush会尝试读取这条发布通告,读到了才开启发布窗口,发布人才能够在页面上进行代码发布。发布窗口期过期后,自动锁定AutoPush禁止发布。

故障原因定位策略

我们目前使用的策略

  1. 调用链越尾端的模块,越有可能是故障根本原因。
  2. 监控指标中越下层的,越有可能是故障根本原因。

根据“模块调用关系”和“指标分层”的概念,采用递归的方法去遍历所有事件,得到一个疑似故障原因诊断报告。

范例如下

“广告服务”的接口响应时间异常(为3s),疑似原因为“索引模块”的服务器xxx.autohome.cc磁盘util异常(为98%)。

保留问题现场

业务层指标是直接反应出服务质量的,是最能代表用户体验的,所以在业务层指标异常发生的时候,我们通过SaltStack这个远程执行通道在服务器上执行snapshot脚本保存当前服务器的运行状态快照,该脚本其实是平时运维在发现问题后登陆服务器上执行常规命令的一个标准化封装,所做的事情有:

  1. 保存uptime指令输出
  2. 保存CPU占用top10
  3. 保存free指令输出
  4. 保存内存占用top10
  5. 保存df指令输出
  6. 保存 ip addr show 指令输出
  7. 保存路由表
  8. 保存Local DNS
  9. 保存 Dig autohome.com.cn 指令输出
  10. 保存 Ping -c 3 autohome.com.cn 输出
  11. 保存TCPDUMP抓包10秒的结果
  12. 等等

同时,在监控系统的“最新问题”页面,点击“现场快照”,上面的信息会直接呈现在页面上,并且点击“历史数据”,页面上会显示问题发生时刻前后30分钟的历史数据曲线,包括CPU,内存,硬盘,IO,网络流量,等等,方便运维快速定位问题。

日志追踪

通过ELK构建日志分析系统,在如下两个方面满足故障定位的需求

  1. 搜索服务器A某个时间段内的B应用程序的日志,通过上文“最新问题”页面可以直接跳转过来。
  2. 通过TraceID搜索单个用户请求的全流程。

四、小结

监控系统的建设真是个任重道远的活,上文只是部分实现了事件关联分析的内容,下一步我们计划在“决策推理”方面进行研发,以提高定位的精准度,为后续的故障自愈打下基础。文中有任何不妥之处,欢迎大家指出。

监控系统故障定位之事件关联分析的设计相关推荐

  1. 深度剖析SOC高性能实时事件关联分析引擎

    [引言]安全管理平台(SOC) 的一项关键技术就是事件关联分析.借助实时的事件关联分析引擎,安全管理平台能够发掘出复杂的海量安全日志和事件背后隐藏的信息,引导安全管理人员发现外 部***和内部违规行为 ...

  2. 浅谈安全管理平台中的事件关联分析

    在当今社会中,随着信息技术的迅猛发展,企业内部的网络环境正面临着复杂多变的信息安全问题.这里既有来自于互联网对企业内网的各种入侵和攻击威胁,也有来自于企业内网中的违规操作和信息泄漏.为了应对层出不究的 ...

  3. Twitter监控系统、Spotify事件交付、Netflix大数据实战——QCon上海2016精彩演讲前瞻...

    QCon上海2016,再次与您相约金秋10月. \\ QCon上海2016将于10月20日~22日在上海宝华万豪酒店召开,目前已经确认20余位演讲嘉宾,来自阿里巴巴.百度.360.携程.搜狗.Twit ...

  4. 消防电源监控系统在春晓161#地块人防工程的设计与应用

    摘要:本文简述了消防设备电源的组成原理,分析了消防设备电源监控系统在应用中的设计依据和相关规范.通过安科瑞消防设备电源监控系统在春晓161#地块项目的实例介绍,阐述了消防设备电源功能的实现及其重要意义 ...

  5. 电力监控系统在多协议粮食港区中的设计与应用

    摘要:针对目前各企业在建设配电系统过程中,使用不同厂家.多种型号的电力仪器与设备,导致通信协议不统一,升级改造和运营维护困难等问题.设计一种支持多协议的电力监控系统,可接入不同厂家的电力仪表和设备,具 ...

  6. 安科瑞电气火灾监控系统在春晓161#地块人防工程的设计与应用

    安科瑞 华楠 摘要:本文简述了电气火灾监控系统的组成原理,分析了电气火灾监控系统在应用中的设计依据和相关规范.通过安科瑞剩余电流式电气火灾监控系统在春晓161#地块人防工程电气火灾监控系统项目的实例介 ...

  7. 电力监控系统在嘉兴万豪酒店的设计与应用

    安科瑞 鲍静君 [摘要]:电力供应是整个社会生产.人民生活的基本保证之一,也是普遍的能源形式,而且多数资源都被人类运用各种方式转换为电能而加以利用,经济的高速运行也使各领域的用电负荷急速上升,各种疏漏 ...

  8. 软件设计实验(一)C#火车售票系统-基于UML的软件分析与设计模型建模实验(用例图、类图、时序图)

    主要从用户管理模块分析: (1)用例图: (2)类图: (3)时序图:

  9. 全球与中国远程家庭监控系统市场深度研究分析报告

    [报告篇幅]:99 [报告图表数]:135 [报告出版时间]:2022年1月 报告摘要 本文研究全球及中国市场远程家庭监控系统现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲. ...

最新文章

  1. pcb成型板aoi检测_一种PCB板的AOI检测控制系统的制作方法
  2. Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!
  3. 安装Orcale 10g SP3时报oui.exe异常错误
  4. Linux vim开启/关闭代码着色(高亮显示)
  5. 时间控件_Selenium时间控件的处理
  6. [算法系列之二十六]字符串匹配之KMP算法
  7. SpringCloud Zuul(八)之ERROR Filter
  8. 【Python 必会技巧】三元表达式(三目运算符)
  9. 网页制作小技巧:dl dt dd标签用法
  10. 陈省身数学奖获得者张继平:怎样才能学好数学?
  11. python学习之路-1 python简介及安装方法
  12. 读书笔记--疯狂Android讲义 目录
  13. TSNE—聚类结果可视化
  14. Atitit. .net c# web 跟客户端winform 的ui控件结构比较
  15. 企业微信邀请通知在哪里设置?如何关闭?
  16. python实现isprime函数_Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数...
  17. python例子之一句话求列表中偶数
  18. 数据权限简单设计思路
  19. 【社招】【邮储总行】软件研发中心2022年社招开发专场
  20. python解决Failed building wheel for XXX

热门文章

  1. 洛谷3672:小清新签到题——题解
  2. Rancher体系下容器日志采集
  3. Linux进阶之进程与线程
  4. 2017 年全球十大突破技术:逼格很高很难懂
  5. 如何从SQL Server查找指定的临时表
  6. VMware 软件被曝其史上最严重的信息泄露漏洞之一,影响大量虚拟机和主机
  7. 俄罗斯国有电信提供商被指大规模劫持网络流量,意外还是阴谋?
  8. “心脏出血”后,OpenSSL 起死回生靠什么?
  9. jQuery基础系列
  10. (Mirage系列之四)Mirage经典案例之集中桌面管理