宜信智能监控平台建设实践

本文整理自宜信技术学院第 6 期技术沙龙,宜信智能监控平台负责人谢知求介绍宜信智能运维平台 UAVStack 的设计思想、技术架构和核心功能,及落地实践经验。

一、UAVStack 平台的产生背景

目前业界常用的监控软件有很多,主流产品或以监控深度见长、或以监控广度见长。

  • 关注监控广度的代表产品是 Prometheus,其特点是生态圈活跃,针对常见的互联网中间件(如 MySQL、Redis、Kafka、RocketMQ、MongoDB、ElasticSearch 等)均提供了现成的指标采集插件来进行监控。类似产品还有 Zabbix、Nagios 和 Open-Falcon。
  • 关注监控深度的产品也有很多,如听云、OneAPM、PinPoint、SkyWalking。这类软件一般是探针型的,在应用性能监控方面提供了更深入的监控能力。

这些产品各有优势,也存在不足之处:

  • 无法兼顾监控的广度和深度;
  • 无法同时支持实时指标、调用链和日志三类类数据的采集,未考虑这三类功能的集成连通性,无法解决数据的时效、品控、对齐等问题。

为了克服上述不足,同时满足公司多样化和智能化的监控需求、降低二研的成本和难度,我们自主研发了全维监控与智能运维基础平台(UAVStack)。

作为智能监控平台,监控仅仅是智能化运维的第一环。我们认为,智能运维 (AIOps) 可以分三步走:全维监控、全维关联和全维智能。

  • 第一步:全维监控,通过统一的采集体系,采集全维度的监控数据,包括系统、应用和服务的画像数据、实时指标数据、调用链数据和日志数据。
  • 第二步:全维关联,获取全维度的监控数据后,需要进一步建立数据之间的关联关系。这种关联关系可以是通过画像、服务流图谱或调用链数据建立的强关联关系,也可以是通过机器学习算法建立的关联关系。通过全维关联,可以在监控数据之间建立实时关联关系;有了关联关系,我们就可以做根因分析了。
  • 第三步:全维智能,通过引入包括异常检测、根因分析、智能降噪及任务机器人等 AI 服务,用机器取代人进行一些决策,从而持续提升公司智能化运维的水平。

二、UAVStack 平台的总体技术架构

2.1 全维度监控 + 应用运维解决方案

使用 UAV 的全维监控和应用性能管理工具集可以搭建一站式全维度监控 + 应用运维解决方案。

首先,UAV 在每个物理机、虚拟机以及容器上部署一个监控代理程序(MonitorAgent,MA)。MA 实际上是部署在宿主机上的独立 JVM 进程。

其次,在每个 JEE 中间件、JSE 应用或其他 JVM 语言应用中,可通过 Java Agent 的形式植入监控探针,监控探针会与应用在同一个 JVM 进程中一起启动。

监控探针启动时,会自动对应用进行画像和监控。应用画像包括服务组件、客户端组件和日志组件的画像。

  • 服务组件是应用对外暴露服务能力的接口,如服务 URL;
  • 客户端组件是应用访问的其它服务或第三方数据源(如 MySQL,、Oracle、 Redis、MQ 等)客户端;
  • 日志组件是应用输出的日志。

除对以上三类组件进行自动画像和实时数据采集外,监控探针也会记录每个请求 / 响应生成端到端的调用链路,绘制各个应用 / 服务之间的调用关系,并生成服务图谱。

监控代理程序(MA 进程)会定时拉取监控探针采集的数据,同时也会采集应用环境的性能指标(如 CPU、内存、磁盘 IO 等)。此外,MA 还提供了插件机制,支持个性化指标的采集。

最终,我们采集到了包括指标 Metrics、调用链 Tracing 及日志 Logging 的全维度监控数据。其中:

  • Metrics 数据包括:业务自定义指标、应用环境性能指标、应用集群 / 实例性能指标、服务组件 / 客户端组件 /URL 性能指标。
  • Tracing 数据包括调用链指标、客户端体验(UEM)数据。
  • Logging 数据包括日志、线程栈(Thread)数据。

2.2 监控探针架构

UAV 采集侧主要包括监控 Agent 和监控探针两部分。

  • 监控探针负责应用层面的监控。
  • 监控 Agent 负责应用环境层面的监控,同时会定时拉取监控探针的数据并上送给 UAV 服务端。

上图所示是监控探针的架构图。随着 UAV 功能的增强,探针已不仅仅用于监控目的,现在已经改名为中间件增强框架。

上图左边可以看到,中间件增强框架位于应用服务器和应用之间,采用了中间件劫持技术,对应用服务器的代码进行了类加载劫持和字节码改写,对上层应用代码无侵入。

右边是监控探针放大之后的架构图,最底层是应用服务器适配层,对互联网常用的开源中间件(如 Tomcat、Jetty、SpringBoot)提供了适配支持,对其它服务器可以相应地扩展一个 Adapter 适配器来进行支持。

在适配层之上,首先提供了一系列通用的扩展点 SPI,再基于这些 SPI,扩展出了与监控相关的画像收集和指标采集功能;与问题诊断分析工具相关的调用链跟踪、浏览器跟踪、JVM 线程分析、堆内存 dump 执行等功能;与服务治理相关的服务限流 / 降级以及服务安全管控等功能。此外,还提供了这些功能对 Docker 和 K8s 容器环境的适配。

最上层提供了应用对接 API 以及数据发布 API,支持通过 HTTP 和 JMX 两种方式来获取探针上的监控数据。

2.3 数据捕获架构

接下来将介绍 UAV 数据捕获和传输的架构。

从上图可以看到,监控代理程序 Agent 数据传输采用了双通道 + 双心跳的方式:

1)双通道是指 HTTP 心跳和 MQ 传输这两条通道:

  • Http 心跳传输通道,用来传输应用环境相关的监控数据,主要包括:容器 / 节点画像数据和实时监控数据;
  • MQ 传输通道,用来传输应用相关的监控数据,主要包括:应用实时数据,画像数据,日志数据,以及调用链和 JVM 线程栈等 APM 数据。MQ 数据传输通道上的数据格式采用了统一的 Schema,方便后期对数据的转换和处理。

2)双心跳是指不管来自 Http 通道还是 MQ 通道的数据,实际上既可以看成监控数据,也可以看成心跳数据。来自每个通道的数据都会到 UAV 监控后台服务“签到”。两种通信方式意味着更高的可靠性。

Agent 通过双通道的方式,将数据传输到 UAV 监控后台,我们称之为健康管理服务。

健康管理服务会根据数据类型对监控数据进行解析处理,并分别持久化到合适的数据源,比如 OpenTSDB 存储时序指标数据;ES 存储日志、调用链、JVM 线程分析等 APM 数据。

AppHub 是 UAV 的统一门户,提供了监控数据的集中展示及用户权限的管理功能。用户可以在 PC 端和移动端登录 UAV,获得随时随地的运维体验。

健康管理服务也是采用微服务架构构建的,包括多个微服务,支持集群部署和扩容。

三、UAVStack 平台的核心功能及其原理(附案例)

3.1 UAVStack 核心功能

上图展示了目前 UAVStack 的核心功能,主要包括:应用监控、应用环境监控、服务流、调用链、JVM 监控、数据库监控、日志监控、性能告警、浏览器跟踪、配置中心、时空沙盘、上帝罗盘、服务治理、容器生态支持、业务监控、智能运维(AIOps)等。其中:

  • 浏览器监控:用来监控前端 Web 页面的性能数据;
  • 时空沙盘:提供了对历史监控数据的查询;
  • 上帝罗盘:提供了监控大屏的展示;
  • 智能运维(AIOps)包括:异常检测、根因分析、告警收敛和智能降噪、任务机器人四个方面的能力。

此外,还包括图上未列出的一些运营支持的相关工具,如 UAV 统一升级中心;UAV 监控日报、周报、月报;UAV 使用情况统计等。本次分享将重点介绍上图中白色字样的功能。

3.2 应用监控

首先介绍 UAV 应用监控的核心原理。

3.2.1 核心原理:对应用代码无侵入技术

UAV 应用监控的核心原理是:对应用代码无侵入技术。

  • UAV 对应用代码无侵入,应用无需任何改造。
  • UAV 不需要应用使用统一的开发框架。

UAV 的代号是“无人机”的缩写,寓意:无人机翱翔蓝天,智能地、透明地完成任务。

其中用到的核心技术主要包括:

  • 中间件劫持技术,含 Java Agent 探针和字节码改写;
  • 应用 / 服务画像与监控技术。

3.2.2 无侵入技术:应用 / 服务画像

监控探针通过中间件劫持技术实现对应用 / 服务的自动画像和监控。

  • 中间件劫持就是将我们自己的代码植入到中间件的各种行为中。
  • 中间件劫持的核心是:掌控类加载树,获取优先加载权,植入我们自己的代码。

以应用 / 服务画像为例:

  • 当 Web 容器中 Standard Context 这个类加载时,通过字节码改写植入了相关的画像代码。JEE 应用启动时会执行植入的代码,生成应用画像和服务画像;
  • 应用画像主要包括:应用标示、应用名称、应用的 URI:http(s)://< 本地 IP>:< 端口 >/、应用的类库信息(从加载应用的 webapp class loader 中获取);
  • 服务画像是按照 JEE 技术规范进行扫描的,通过扫描注解和部署描述符,提取了服务注册相关的信息,从而生成了服务画像。

3.2.3 无侵入技术:应用 / 服务监控

与应用 / 服务画像类似,应用 / 服务监控也是在加载服务器相关类时,通过字节码改写植入相应的监控代码。

以 Tomcat 为例:

  • CoyoteAdapter 负责整个 Tomcat 的服务请求;StandardWrapper 负责所有 Servlet 的服务请求。
  • 加载这两个类时,UAV 会通过字节码改写植入监控代码。当有实际请求发生时,会调用植入的请求拦截代码和响应回复拦截代码,进行性能指标的采集。
  • 采集到的性能统计指标会缓存到全局计数器中,后续由监控 Agent 集中采走。

上图所示是应用监控的一个实际展示界面。

可以从应用集群的展示界面,钻取到应用实例的监控展示界面,再钻取到自动画像出来的服务组件 / 客户端组件和日志组件的展示界面,最后再钻取到服务组件 / 客户端组件的每个 URI 的监控指标界面以及日志展示界面。可以从全局钻取到细节,获取想看的监控数据。

此外,我们还提供了服务 URL 监控报表和客户端 URL 监控报表。

以服务 URL 监控报表为例:

  • 可以直观地看到该应用中所有服务 URL 的访问计数、平均响应时间、累计访问计数、累计错误计数、成功率等指标在选定时间区间内的统计数据。
  • 时间区间支持最近 10 分钟、最近 3 小时、今天、昨天、最近 7 天以及自定义的任意时间区间。

如上图,点击查看某个 URL 的详情,可以查看该 URL 在不同时间区间的详细报表。

3.3 应用 / 服务拓扑:服务流

接下来介绍服务流相关的功能。基于应用 / 服务画像和监控数据,UAV 提供了服务流的功能。服务流涵盖了应用拓扑的内容,但提供了比应用拓扑更丰富的运行时状态的展示。

从上图可以看到,当前服务位于中间位置,左边是调用当前服务的服务,右边是当前服务调用的其它第三方服务。

在服务流图上,连线的粗细表示调用量;连线的颜色代表健康状况,以响应时间和错误数为参考:绿色代表健康、黄色代表警告、红色代表严重。比如当连线为粗红线时,代表着有大量请求发生了错误。

如图,我们可以从全局的服务流钻取到某个业务线的服务流,再钻取到该业务线下某个应用集群 / 实例的服务流,进行全局范围的性能追踪。

3.4 调用链

3.4.1 调用链:全链追踪

调用链分为轻调用链、重调用链和方法级调用链。

  • 轻调用链也叫基本调用链。应用无需任何改造,可以运行时启动和停止。获取的数据包括服务 / 请求 URL、服务类 + 方法、调用类 + 方法、耗时、结果状态 + 异常、应用特征、技术栈特征等,性能开销可以忽略;
  • 重调用链是在轻调用链的基础上增加了对请求 / 响应数据报文的获取,性能开销稍大,依据报文数据量一般会有 5% 的性能下降;
  • 方法级调用链:如果不开启方法级调用链,则仅在服务的入口和出口生成调用链节点。如果想要在应用内部也生成调用链节点,可以使用方法级调用链。可以通过 AppHub 界面配置需要跟踪的类和方法。方法级调用链的性能开销较小,具体消耗取决于报文数据量。

3.4.2 调用链:实现原理

上图展示的是一个调用链具体的生成流程。调用链节点主要是在服务接口代码处和客户端调用代码处生成。如果开启了方法级调用链,也会在过程方法代码处生成调用链节点。

此外,介绍一下关于调用链上下文的传递。

服务内上下文的传递:同线程的情况下使用了基本 ThreadLocal;跨线程(池)的情况下使用了可传递 ThreadLocal(TTL)。

服务间上下文的传递:通过客户端劫持(client hook) 对原协议(如 HTTP,RPC,MQ)进行适配,并在协议头注入调用链上下文的元数据。传输到下一个服务接口的时候,会由下一个服务解析协议头里的调用链上下文元数据,重新构建调用链上下文,然后再继续往下传递。

3.4.3 调用链:关键技术

调用链的实现主要使用了 4 个关键技术。

  • 服务内上下文的传递。主要基于原 threadlocal 实现了支持父子线程之间值传递的 threadlocal。
  • 服务间上下文的传递。通过客户端劫持(client hook),对原协议进行适配,并在协议内注入调用链上下文元数据。
  • 报文体内容提取。重调用链提取请求 / 响应数据报文体内容时,为把对应用的影响降到最低,使用了 servlet wrapper 机制在用户读取报文体时进行数据转存(利用 string 池的属性最小占用内存)。
  • 调用链数据的收集和处理。通过 agent 对调用链数据进行抓取,HM 端进行数据解析入库并提供查询接口,使用极简数据格式最小化占用带宽。

3.4.4 调用链展示:可视化,可关联日志,快速定位问题

这是调用链的实际展示界面。在调用链列表上,

  • 可以一键获取最近 1 分钟、最近 12 小时前 100 及最近 1 小时最慢的调用链。
  • 可以根据应用服务的特征,按照时间区间或业务关键词自定义搜索相关的调用链。
  • 在调用链的任何环节,都可以查看整个端到端的完整的调用链。
  • 通过端到端完整的调用链的展示,可以快速发现调用缓慢的瓶颈或出错的节点。
  • 可从调用链的任意节点跳转到日志界面,查看该调用链环节对应的日志。
  • 可以从日志界面跳转到该日志对应的调用链,查看该日志位于完整调用链路的哪一环,从而帮助我们快速排查和定位问题。

3.4.5 调用链展示:查看请求 / 响应报文

开启了重调用链的情况下,我们可以查看请求 / 响应报文的详细数据。

上图中可以看到,开启了重调用链的情况下,我们可以获取到请求头信息、请求内容、响应头信息、响应内容等详细数据。

3.5 日志监控 / 管理

3.5.1 日志捕获架构

上图所示是 UAV 日志功能的架构图。UAV 日志功能采用了日志管理系统流行的 EKK 架构,包括日志的采集、上送 Kafka、ES 存储 / 查询、RAID 历史备份 / 下载以及基于异常 / 关键字和时间的统计和告警功能。

应用服务器上的 Agent 采集、读取日志,并把读取到的数据发送到 Kafka 集群上。

  • 对于需热查询的日志,由 logging-store 程序从 Kafka 读取日志并保存到 ElasticSearch 集群中;
  • 对于需冷备份的日志,由 logging-raid 程序从 Kafka 读取日志,先存到本地磁盘,每天凌晨会将本地日志按天压缩,备份到 RAID 集群中。

日志的统计和告警功能:由 logging-statistics 程序从 Kafka 读取异常、关键字、Nginx 日志,并以分钟为单位统计数量,保存到 Redis 中,供后续统计展示和告警。

具体日志展示界面在介绍调用链关联到日志部分已出现过了,这里就不赘述了。

3.6 性能告警

3.6.1 性能告警:多指标联合表达式,流式 / 同比 / 环比,双收敛,反馈动作

UAV 获取到全维度的服务端指标集、客户端指标集、日志指标集和自定义指标之后,可以设置多指标联合告警条件,这些条件包括流式 / 同比 / 环比的条件(“同比”比如今天 10 点和昨天 10 点的对比;“环比”比如最近 5 分钟和上一个 5 分钟的对比),可以混合使用构成联合表达式。

为避免告警轰炸,UAV 提供了 2 种告警收敛策略:时间冷却收敛和梯度收敛。梯度收敛策略上,我们配置了“1”“5”“10”,即第 1 次、第 5 次、第 10 次满足告警条件时才会发送告警提醒,其他时间则进行压制处理,不发送告警提醒。

告警可通过短信、邮件、微信及移动 App 推送通知到人,也可以通过 HTTP 方式通知其他系统。

3.6.2 性能告警:预警策略模板、灵活的策略编辑、多种通知

创建预警策略时,可以使用预警策略模板。上图是系统里的预警策略模板截图。

选定策略类型之后,预警策略的规则和条件会根据我们缺省推荐的套餐自动设置,用户只要配置需要报警的目标范围和通知方式,直接保存就可以了。也可以调整模板套餐里的阈值和报警表达式。此外,告警也支持运行时动态启用和禁用。

3.7 JVM 监控分析

3.7.1 JVM 监控分析工具:整体架构

JVM 监控分析工具基于 UAVStack 已有整体架构,如上图所示。整体分为前端、后台及探针 MOF 部分。

  • 前端负责数据展示以及向后台发送用户的执行指令。
  • 后台负责将指令下发到具体节点及结果的归集和处理。
  • 监控探针 MOF 负责接收后台下发的指令,执行指令返回结果。

其中在探针部分:

  • JVM 实时监控数据,如堆内存大小、Minor GC 和 Full GC 的情况,都是通过 JMX 提供的接口来获取。
  • JVM 堆内存采样分析数据和 CPU 采样分析数据,则通过 JDK 提供的 Java Attach API 进行获取。

3.7.2 JVM 监控分析工具:监控功能展示

上图是 JVM 监控分析工具的监控功能展示页面。JVM 监控分析工具的功能主要包括:

  • 基本信息 Tab 显示 JVM 基本信息,包括 JVM 版本、启动时间、JVM 参数、系统属性等。
  • 监控 Tab 提供 JVM 实时监控指标展示,包括 CPU、线程、内存、GC 统计等。用户可以切换时间 / 区间,比如最近 10 分钟、最近 3 小时、今天、昨天、最近七天或自定义的时间 / 区间,查看不同时间 / 区间内的 JVM 监控数据。
  • 线程分析和内存 Dump Tab 提供了 JVM 线程分析与 JVM 堆内存 Dump 在线工具。
  • CPU 采样和内存采样 Tab 提供了 JVM 堆内存采样分析和 CPU 采样分析工具。

3.7.3 JVM 监控分析工具:堆内存采样和 CPU 采样分析

  • 堆内存采样分析可实时采样 JVM 的堆内存分配、每个类实例对象的数量以及这些实例所占用的内存大小,从而辅助定位内存泄露的根源。
  • CPU 采样分析可实时采样 JVM 每个方法的 CPU 执行时间,可辅助定位热点方法。比如 CPU 达到 100% 时,可以定位哪些方法占用 CPU 比例较高。

3.8 数据库监控

3.8.1 数据库监控:核心功能

区别于传统的数据库端的监控,UAV 的数据库监控采用新的视角,从应用端切入分析,弥补了现有数据库端监控的不足,增加了数据库 - 应用的关联分析能力。

数据库监控目前已实现的功能包括:数据库连接池监控、SQL 分类统计、慢 SQL 统计、慢 SQL 耗时分布统计、慢 SQL 追踪以及与调用链 / 日志关联。

慢 SQL 的监控功能主要包括慢 SQL 统计 + 慢 SQL 追踪。对慢 SQL 的监控,可以自主设定阈值,界定多慢才算是慢 SQL。用户可以按具体应用和它操作的数据库实例来设置,高于设置阈值的 SQL 操作才计入慢 SQL。

在开启调用链 / 日志归集的情况下, 慢 SQL 操作可关联至对应的调用链以及日志,帮助我们诊断和定位问题。

上图是数据库监控功能的慢 SQL 统计报表,展示了某段时间之内慢 SQL 的计数情况。慢 SQL 分类统计根据 SQL 类型,包括 I- 插入、D- 删除、U- 更新、Q- 查询、B- 批量操作,对慢 SQL 进行分类统计。

图中下方两个报表中,一个是数据库连接池监控,可以查看连接池总连接数、活动连接数以及空闲连接数;另一个是 SQL 分类统计,可以根据 SQL 类型来分类统计。

3.8.2 数据库监控案例:某催收系统

通过某外购催收系统的数据库监控案例来说明数据库监控的使用方法。

催收系统在查询催收历史时,统计记录数的 count(*) 语句,因为执行计划异常,执行效率低,占用了大量资源,导致数据库服务器 CPU 资源耗尽,进而系统不可用。从图上可以看到,故障期间的慢 SQL 数目明显变大,慢 SQL 具体为 count(*) 语句。

上图可以查看到慢 SQL 的详细 SQL 语句,得知故障期间的连接池资源被耗尽,活动连接数达到峰值,而空闲连接数为 0;SQL 分类统计图表也显示故障期间查询错误 SQL 数量明显变大。

通过慢 SQL 追踪界面,可以查看故障期间的慢 SQL 列表,发现执行时间长的三条 SQL 全是 count(*) 语句。

每一条慢 SQL 的执行结果及 SQL 语句都可以与调用链关联。继续点击,查看慢 SQL 详情及与调用链关联,均显示了 count(*) 语句执行时间长,且执行错误。通过慢 SQL 的执行与调用链、日志的关联,可以辅助定位和分析故障问题。

3.9 容器生态支持

3.9.1 容器生态支持:基本原理

对容器生态上的支持是指 UAV 以上所有功能都能在容器云平台上无缝迁移和使用。在容器环境下,监控 Agent 和应用分别在不同的容器中,需要做一些适配工作,主要体现在应用画像 / 监控数据的采集、进程画像 / 监控数据的采集、日志采集路径的适配上。

  • 首先,在应用画像 / 监控数据的采集上,监控 agent 容器应允许通过容器的虚拟 IP 访问应用的容器,通过 http 请求获取应用画像及实时监控数据。
  • 其次,在进程画像 / 监控数据的采集上,监控 agent 的容器 PID namespace 需要和宿主机保持一致,从而保证监控 agent 可以扫描宿主机的 /proc 目录获取进程信息。
  • 最后,在日志采集路径的适配上,监控 agent 应允许通过 API 获取应用和 agent 自身使用的 volume 信息。有了双方的 volume 信息,agent 才能正确地在自身的容器内找到应用输出的日志路径。

3.9.2 容器生态支持:应用环境监控 — Kubernetes

UAV 以上所有功能都能在容器云平台上的无缝迁移和使用,所以从 UI 上看不出来和 VM 有何区别,仅在应用环境监控界面上有些不同。上图截取了 Kubernetes 环境下的应用环境监控界面,可以看到一个物理主机上有 10 个主机进程、17 个容器、28 个在容器里的进程。

应用环境监控可以显示容器和进程的对应关系。可点击分别查看容器性能指标和进程性能指标。

在容器或进程的属性列表里,新增了 K8S 相关的属性展示。这是在容器云环境下,我们可以从应用环境监控 UI 中看到和 VM 环境下的些许差异。而对于其它功能(如调用链、日志监控、数据库监控,等等)而言,界面在容器环境下和 VM 环境下是没有任何区别的,用户感觉不到差异。

3.10 Agent 插件支持

3.10.1 Agent 插件支持:支持 Open-Falcon 插件与 UAV 自定义插件

为了弥补监控广度上的不足,UAV 目前提供了指标采集插件,支持已有的 Open-Falcon 的指标采集插件(类似 Prometheus 的 exporter),也支持 UAV 自定义插件,使 UAV 监控能力可灵活扩展到对几乎所有常用的互联网中间件的监控,如 MySQL、Redis、Kafka、RocketMQ、MongoDB、ElasticSearch 等。

上图展示了 UAV 对 Kafka、RocketMQ、Redis 指标的监控曲线。

3.11 业务链路监控与告警

3.11.1 业务链路监控与告警:解决方案

宜信公司业务大多跨多个业务线和多个系统,为在 IT 层面可以快速定位问题系统,在业务层面上也可以给出受影响或波及的具体业务单据和客户范围,解决业务 / 运营人员的痛点,UAV 提供了一套通用的业务链路监控与告警接入平台。

如图所示,该平台包括异构业务日志归集、数据上送、数据切分、过滤、聚合计算等功能,之后可以将结果持久化,提供业务报表大屏展示,也可以根据结果告警,生成业务工单。

实施过程中,各业务组先在应用中埋点具有业务涵义的日志,然后自助配置和维护对业务日志的解析逻辑、具体的告警策略和告警消息模板内容,从而可以快速搭建针对自身业务的链路监控系统。

这套业务监控系统的优势在于:

  • 将 IT 层面的调用链与业务事件双向关联,给 IT 层面的调用链赋予了业务涵义的同时,将跨系统的调用跟踪升级为跨业务领域的跟踪。
  • 发生问题后,可以发出具有业务涵义的告警消息,将业务问题直接反馈给业务 / 运营人员;也能根据调用链快速定位到问题节点,从而帮到技术运维人员;此外,技术人员与运营人员也可通过业务 ID 反查系统链路来追溯问题。

3.11.2 业务链路监控与告警:业务告警示例

这是一个业务告警的具体例子。

上方是发给业务同事的告警邮件,内容可以细化到 X 年 X 月 X 日 X:X:X,在 X 个系统的 X 个业务环节,发生了 X 问题,影响了 X 类型的客户,客户姓名是 X,手机号是 X。帮助业务运营人员快速定位问题单据和受影响的客户。

下方是发给技术运维同事的邮件,在业务同事邮件的基础上,额外提供了 IT 调用链路,方便技术运维同事快速定位和诊断问题。

3.12 智能运维

目前 UAV 在 AIOps 智能运维上的工程实践主要包括异常检测,根因分析,告警收敛和智能降噪,以及任务机器人 HIT 这 4 个方面。本次分享将重点介绍指标异常检测和根因分析两部分。

3.12.1 智能运维:异常检测框架

上图是 UAV 工程实践中使用的较流行的时间序列异常检测框架。主要包括离线模型优化、在线模型预测、A/B TEST 部分。其中,离线模型优化和在线模型预测形成了指标异常检测的智能监控闭环。具体流程如图所示,其中要点包括:

  • 对无标记数据的分析,采用无监督的方法进行异常识别。比如,在进行连续数据的异常检测时,可选用孤立森林算法,通过多棵 iTree 树形成森林来判断是否异常。
  • 对已标记的数据的分析,采用了监督学习的方法,学习异常和正常群体的历史表现。这样,进行新数据检测时,可以通过模型直接决策,输出异常情况。
  • 但是采用人工标注样本,工作量比较大,一般难以满足监督学习方法对数据量级的要求,所以可采用半监督的方法扩充标注的样本库。

3.12.2 智能运维:全维度的数据可关联

按照全维监控 -> 全维关联 -> 全维智能的技术路线,UAV 采集到了多维度的监控数据后,需要建立起这些数据之前的关联。

这种关联关系:

  • 可以是通过画像建立的强关联关系,比如宿主机与虚拟机、虚拟机与应用服务器、应用服务器和应用、应用和服务组件之间的关系;
  • 也可以是通过调用链路或服务流图谱建立的强关联关系;
  • 也可以是通过机器学习算法建立的关联关系,比如同一时间窗口同时变化的指标,可能存在某种关联。

需要说明的是,金融行业本身的业务特点决定了对第三方存在依赖性,因此告警的随机性较大,客观上导致学习样本的质量不高。因此,UAV 目前使用强关联关系。

3.12.3 智能运维:根因分析,告警收敛与智能降噪

有了关联关系,就可以做根因分析了。我们可以收集各个渠道的告警,先通过告警过滤将其中重复的告警和不重要的告警过滤掉,再根据关联分析建立同一时间窗口内不同类型告警之间的关联,可以按画像建立关联,也可以按调用链路建立关联。然后是权重计算,根据预先设置的各类告警的权重,计算成为根源告警的可能性。最后将权重最大的告警标记为根源告警。此外,还可以根据历史告警处理知识库,找到类似根源告警的推荐解决方案。

在根因分析和定位的过程中,顺带实现了告警收敛和智能降噪。比如我们对重复告警、非根源的一般告警、同一条链路的其它告警进行了压制。

四、总结

上图为线上实际的宜信核心业务线调用关系的图谱。UAV 作为宜信的公司级智能监控标准软件,已持续覆盖到宜信所有关键业务系统,支持公司超过 300 个业务线。越来越多的同事可以熟练地使用 UAV,将 UAV 应用于日常运维、事前预警、事中问题诊断和事后复盘分析等各个方面。

使用 UAV,可以获得随时随地的运维体验。目前 UAVStack 监控部分已在 GitHub 上开源,可以登录查看更多详细介绍。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章