上图左边可以看到,中间件增强框架位于应用服务器和应用之间,采用了中间件劫持技术,对应用服务器的代码进行了类加载劫持和字节码改写,对上层应用代码无侵入。
右边是监控探针放大之后的架构图,最底层是应用服务器适配层,对互联网常用的开源中间件(如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中获取);