900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 宜信智能监控平台建设实践

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

时间:2021-04-20 09:51:52

相关推荐

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

摘要:介绍宜信智能运维平台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数据。

宜信智能监控平台建设实践|分享实录

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方式通知其他系统。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。