摘要:介绍宜信智能运维平台UAVStack的设计思想、技术架构和核心功能,及落地实践经验。
内容来源:宜信技术学院第6期技术沙龙-线上直播|宜信智能监控平台建设实践
主讲人:宜信高级架构师 & 智能监控平台负责人谢知求
一、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数据。