摘要:介绍宜信智能运维平台UAVStack的设计思想、技术架构和核心功能,及落地实践经验。
内容来源:宜信技术学院第6期技术沙龙-线上直播|宜信智能监控平台建设实践
主讲人:宜信高级架构师 & 智能监控平台负责人谢知求
一、UAVStack平台的产生背景
目前业界常用的监控软件有很多,主流产品或以监控深度见长、或以监控广度见长。
这些产品各有优势,也存在不足之处:
为了克服上述不足,同时满足公司多样化和智能化的监控需求、降低二研的成本和难度,我们自主研发了全维监控与智能运维基础平台(UAVStack)。
作为智能监控平台,监控仅仅是智能化运维的第一环。我们认为,智能运维(AIOps)可以分三步走:全维监控、全维关联和全维智能。
二、UAVStack平台的总体技术架构
2.1 全维度监控+应用运维解决方案
使用UAV的全维监控和应用性能管理工具集可以搭建一站式全维度监控+应用运维解决方案。
首先,UAV在每个物理机、虚拟机以及容器上部署一个监控代理程序(MonitorAgent,MA)。MA实际上是部署在宿主机上的独立JVM进程。
其次,在每个JEE中间件、JSE应用或其他JVM语言应用中,可通过Java Agent的形式植入监控探针,监控探针会与应用在同一个JVM进程中一起启动。
监控探针启动时,会自动对应用进行画像和监控。应用画像包括服务组件、客户端组件和日志组件的画像。
除对以上三类组件进行自动画像和实时数据采集外,监控探针也会记录每个请求/响应生成端到端的调用链路,绘制各个应用/服务之间的调用关系,并生成服务图谱。
监控代理程序(MA进程)会定时拉取监控探针采集的数据,同时也会采集应用环境的性能指标(如CPU、内存、磁盘IO等)。此外,MA还提供了插件机制,支持个性化指标的采集。
最终,我们采集到了包括指标Metrics、调用链Tracing及日志Logging的全维度监控数据。其中:
2.2 监控探针架构
UAV采集侧主要包括监控Agent和监控探针两部分。
上图所示是监控探针的架构图。随着UAV功能的增强,探针已不仅仅用于监控目的,现在已经改名为中间件增强框架。
上图左边可以看到,中间件增强框架位于应用服务器和应用之间,采用了中间件劫持技术,对应用服务器的代码进行了类加载劫持和字节码改写,对上层应用代码无侵入。
右边是监控探针放大之后的架构图,最底层是应用服务器适配层,对互联网常用的开源中间件(如Tomcat、Jetty、SpringBoot)提供了适配支持,对其它服务器可以相应地扩展一个Adapter适配器来进行支持。
在适配层之上,首先提供了一系列通用的扩展点SPI,再基于这些SPI,扩展出了与监控相关的画像收集和指标采集功能;与问题诊断分析工具相关的调用链跟踪、浏览器跟踪、JVM线程分析、堆内存dump执行等功能;与服务治理相关的服务限流/降级以及服务安全管控等功能。此外,还提供了这些功能对Docker和K8s容器环境的适配。
最上层提供了应用对接API以及数据发布API,支持通过HTTP和JMX两种方式来获取探针上的监控数据。
2.3 数据捕获架构
接下来将介绍UAV数据捕获和传输的架构。
从上图可以看到,监控代理程序Agent数据传输采用了双通道+双心跳的方式:
1)双通道是指HTTP心跳和MQ传输这两条通道:
2)双心跳是指不管来自Http通道还是MQ通道的数据,实际上既可以看成监控数据,也可以看成心跳数据。来自每个通道的数据都会到UAV监控后台服务“签到”。两种通信方式意味着更高的可靠性。
Agent通过双通道的方式,将数据传输到UAV监控后台,我们称之为健康管理服务。
健康管理服务会根据数据类型对监控数据进行解析处理,并分别持久化到合适的数据源,比如OpenTSDB存储时序指标数据;ES存储日志、调用链、JVM线程分析等APM数据。
AppHub是UAV的统一门户,提供了监控数据的集中展示及用户权限的管理功能。用户可以在PC端和移动端登录UAV,获得随时随地的运维体验。
健康管理服务也是采用微服务架构构建的,包括多个微服务,支持集群部署和扩容。
三、UAVStack平台的核心功能及其原理(附案例)
3.1 UAVStack核心功能
上图展示了目前UAVStack的核心功能,主要包括:应用监控、应用环境监控、服务流、调用链、JVM监控、数据库监控、日志监控、性能告警、浏览器跟踪、配置中心、时空沙盘、上帝罗盘、服务治理、容器生态支持、业务监控、智能运维(AIOps)等。其中:
此外,还包括图上未列出的一些运营支持的相关工具,如UAV统一升级中心;UAV监控日报、周报、月报;UAV使用情况统计等。本次分享将重点介绍上图中白色字样的功能。
3.2 应用监控
首先介绍UAV应用监控的核心原理。
3.2.1 核心原理:对应用代码无侵入技术
UAV应用监控的核心原理是:对应用代码无侵入技术。
UAV的代号是“无人机”的缩写,寓意:无人机翱翔蓝天,智能地、透明地完成任务。
其中用到的核心技术主要包括:
3.2.2 无侵入技术:应用/服务画像
监控探针通过中间件劫持技术实现对应用/服务的自动画像和监控。
以应用/服务画像为例:
3.2.3 无侵入技术:应用/服务监控
与应用/服务画像类似,应用/服务监控也是在加载服务器相关类时,通过字节码改写植入相应的监控代码。
以Tomcat为例:
上图所示是应用监控的一个实际展示界面。
可以从应用集群的展示界面,钻取到应用实例的监控展示界面,再钻取到自动画像出来的服务组件/客户端组件和日志组件的展示界面,最后再钻取到服务组件/客户端组件的每个URI的监控指标界面以及日志展示界面。可以从全局钻取到细节,获取想看的监控数据。
此外,我们还提供了服务URL监控报表和客户端URL监控报表。
以服务URL监控报表为例:
如上图,点击查看某个URL的详情,可以查看该URL在不同时间区间的详细报表。
3.3 应用/服务拓扑:服务流
接下来介绍服务流相关的功能。基于应用/服务画像和监控数据,UAV提供了服务流的功能。服务流涵盖了应用拓扑的内容,但提供了比应用拓扑更丰富的运行时状态的展示。
从上图可以看到,当前服务位于中间位置,左边是调用当前服务的服务,右边是当前服务调用的其它第三方服务。
在服务流图上,连线的粗细表示调用量;连线的颜色代表健康状况,以响应时间和错误数为参考:绿色代表健康、黄色代表警告、红色代表严重。比如当连线为粗红线时,代表着有大量请求发生了错误。
如图,我们可以从全局的服务流钻取到某个业务线的服务流,再钻取到该业务线下某个应用集群/实例的服务流,进行全局范围的性能追踪。
3.4 调用链
3.4.1 调用链:全链追踪
调用链分为轻调用链、重调用链和方法级调用链。
3.4.2 调用链:实现原理
上图展示的是一个调用链具体的生成流程。调用链节点主要是在服务接口代码处和客户端调用代码处生成。如果开启了方法级调用链,也会在过程方法代码处生成调用链节点。
此外,介绍一下关于调用链上下文的传递。
服务内上下文的传递:同线程的情况下使用了基本ThreadLocal;跨线程(池)的情况下使用了可传递ThreadLocal(TTL)。
服务间上下文的传递:通过客户端劫持(client hook)对原协议(如HTTP,RPC,MQ)进行适配,并在协议头注入调用链上下文的元数据。传输到下一个服务接口的时候,会由下一个服务解析协议头里的调用链上下文元数据,重新构建调用链上下文,然后再继续往下传递。
3.4.3 调用链:关键技术
调用链的实现主要使用了4个关键技术。
3.4.4 调用链展示:可视化,可关联日志,快速定位问题
这是调用链的实际展示界面。在调用链列表上,
3.4.5 调用链展示:查看请求/响应报文
开启了重调用链的情况下,我们可以查看请求/响应报文的详细数据。
上图中可以看到,开启了重调用链的情况下,我们可以获取到请求头信息、请求内容、响应头信息、响应内容等详细数据。
3.5 日志监控/管理
3.5.1 日志捕获架构
上图所示是UAV日志功能的架构图。UAV日志功能采用了日志管理系统流行的EKK架构,包括日志的采集、上送Kafka、ES存储/查询、RAID历史备份/下载以及基于异常/关键字和时间的统计和告警功能。
应用服务器上的Agent采集、读取日志,并把读取到的数据发送到Kafka集群上。
日志的统计和告警功能:由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部分。
其中在探针部分:
3.7.2 JVM监控分析工具:监控功能展示
上图是JVM监控分析工具的监控功能展示页面。JVM监控分析工具的功能主要包括:
3.7.3 JVM监控分析工具:堆内存采样和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和应用分别在不同的容器中,需要做一些适配工作,主要体现在应用画像/监控数据的采集、进程画像/监控数据的采集、日志采集路径的适配上。
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提供了一套通用的业务链路监控与告警接入平台。
如图所示,该平台包括异构业务日志归集、数据上送、数据切分、过滤、聚合计算等功能,之后可以将结果持久化,提供业务报表大屏展示,也可以根据结果告警,生成业务工单。
实施过程中,各业务组先在应用中埋点具有业务涵义的日志,然后自助配置和维护对业务日志的解析逻辑、具体的告警策略和告警消息模板内容,从而可以快速搭建针对自身业务的链路监控系统。
这套业务监控系统的优势在于:
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部分。其中,离线模型优化和在线模型预测形成了指标异常检测的智能监控闭环。具体流程如图所示,其中要点包括:
3.12.2 智能运维:全维度的数据可关联
按照全维监控->全维关联->全维智能的技术路线,UAV采集到了多维度的监控数据后,需要建立起这些数据之前的关联。
这种关联关系:
需要说明的是,金融行业本身的业务特点决定了对第三方存在依赖性,因此告警的随机性较大,客观上导致学习样本的质量不高。因此,UAV目前使用强关联关系。
3.12.3 智能运维:根因分析,告警收敛与智能降噪
有了关联关系,就可以做根因分析了。我们可以收集各个渠道的告警,先通过告警过滤将其中重复的告警和不重要的告警过滤掉,再根据关联分析建立同一时间窗口内不同类型告警之间的关联,可以按画像建立关联,也可以按调用链路建立关联。然后是权重计算,根据预先设置的各类告警的权重,计算成为根源告警的可能性。最后将权重最大的告警标记为根源告警。此外,还可以根据历史告警处理知识库,找到类似根源告警的推荐解决方案。
在根因分析和定位的过程中,顺带实现了告警收敛和智能降噪。比如我们对重复告警、非根源的一般告警、同一条链路的其它告警进行了压制。
四、总结
上图为线上实际的宜信核心业务线调用关系的图谱。UAV作为宜信的公司级智能监控标准软件,已持续覆盖到宜信所有关键业务系统,支持公司超过300个业务线。越来越多的同事可以熟练地使用UAV,将UAV应用于日常运维、事前预警、事中问题诊断和事后复盘分析等各个方面。
使用UAV,可以获得随时随地的运维体验。目前UAVStack监控部分已在GitHub上开源,可以登录查看更多详细介绍。