资讯专栏INFORMATION COLUMN

中间件增强框架之InterceptFramework

chnmagnus / 2271人阅读

摘要:拦截之前的准备在应用启动的特定生命周期内改写字节码,植入特定的逻辑处理代码进行拦截。劫持通过字节码改写动态代理等技术,在客户端调用代码中嵌入特定处理逻辑,获取调用相关的信息,如调用地址调用协议调用结果等。

这次我们为大家带来中间件增强框架专题(MOF)的最后一篇文章,为大家讲解MOF中的InterceptFramework框架。该框架可以在应用启动过程中获取画像信息,实现应用画像数据采集和存储。

前言

在智能运维中,应用服务所使用的组件及JAR包等相关信息非常重要,这些信息能够清晰地描绘一个应用服务的骨架,我们称这些信息为应用画像。在UAVStack中,中间件增强框架(MOF)下的InterceptFramework可以在应用启动过程中获取画像信息。本文主要介绍InterceptFramework的架构原理和在此基础上实现的应用画像数据采集与存储。

整体架构

关键技术

Javaassist

Hook

关键类及功能

Profile数据和客户端监控指标主要通过InterceptSupport和hookProxy机制捕获和监控。

Profile也会安装至DataObserver对象并暴露JMX/HTTP接口。

拦截之前的准备

1.在应用启动的特定生命周期内改写字节码,植入特定的逻辑处理代码进行拦截。

2.拦截框架对应的Supporter启动,从配置文件中获取应该装载的Listener,构建InterceptSupport实例,把Listener添加到InterceptSupport实例中。

具体的拦截逻辑

在应用启动过程中的特定生命周期,之前植入的代码拦截逻辑开始执行InterceptSupport的doIntercept方法,遍历已注册的Listener监听器。每个监听器都继承自InterceptEventListener类。不同的子Listener对相应类型的画像采集处理:AppProfilingListener负责监听所有服务画像事件,AppFrkHookFactoryListener负责监听客户端画像事件。

架构说明

InterceptSupport:单例作为统一的Profile/Client hook捕获入口点

InterceptContext:捕获上下文接口, 所有捕获参数由Context封装

InterceptEventListener:事件劫持监听器, 所有监听器需继承并注册监听

AppProfilingListener:服务画像监听器, 监听所有服务画像事件

AppFrkHookFactoryListener:客户端画像监听代理

关键类说明

StandardProfile:实现了Profile接口,是画像数据抓取实现类,提供了doProfiling方法负责抓取行为和生成抓取结果;

ProfileHandler:不同的抓取逻辑和抓取点的共同接口,实现不同的抓取逻辑;提供了抓取行为的doProfiling方法;

StandardProfileRepository:存储画像数据抓取数据结构;

DataObserver:暴露了JMX/HTTP接口数据;

Profile实时监控在从AppProfilingListener类调用startProfiling时,将Profile对象安装到DataObserver对象中;

DataObserver提供JMX/HTTP服务,供后续抓取使用,其中Http服务注册了HttpJEEProfileObserver,主要负责画像数据的抓取服务;

各个Handler类具体处理抓取的各类数据。

画像数据

画像数据即静态数据,是在进程启动时即可得到的数据,包括操作系统相关的信息、程序相关的信息、程序启动后相关的初始化信息。

画像数据主要包括服务画像、溯源感知画像和客户端画像三部分,如上图所示。以下分别从这三个方面介绍画像采集:

服务画像采集

服务画像描述了服务本体的信息,包括应用唯一标识(AppID)、服务名(Service ID)、服务实例的URI、服务接口的URI、服务接口的元数据(类、方法、入参出参、注解、部署描述符)。

以Tomcat为例,应用的启动过程需要经过StandardContext的start方法。我们可以在此方法的最后植入代码逻辑进行拦截,通过拦截可以获取到以下信息:

应用名、webworkdir(工作目录)、servletcontext、contextpath、basepath(应用实际路径)等容器上下文信息;

根据相应的技术规范(Servlet、JAXRS、JAXWS、Spring等)获取画像数据,主要包括:通过反射的方式获取类和方法名以及出参入参信息、扫描注解类、获取注解信息、解析部署描述符文件(web.xml等)信息。

服务画像除了获取以上信息外,还获取应用的日志路径和所用JAR包等信息。

溯源画像采集

溯源画像采集主要借助HTTP协议Header中的字段进行溯源,通过中间件劫持技术拦截Tomcat中StandardEngineValve的Invoke方法,获取溯源数据。

收集的数据有以下几种:

Client Address:直连客户端IP地址;

X-Forwarded-For:如果存在,则为代理路由地址链,则直连客户端为代理服务;

Host:表明远程主机甚至端口信息,如果直连客户端是代理服务,则Host为代理IP地址和端口;

User-Agent:代理描述,可用来区分浏览器还是程序客户端,还可以提取很多浏览器终端信息;

UAV-Client-Src:HTTP客户端劫持加入的Header字段,用于UAV应用之间调用的拟合。

客户端画像采集

客户端画像通过对一系列常用中间件客户端进行劫持实现,目前已支持同步/异步http、数据库jdbc、redis(jedis,aredis,lettuce)、mongodb、rocketmq/rabbitmq/Kafka、ESClient等。

劫持通过javaassist字节码改写、动态代理等AOP技术,在客户端调用代码中嵌入特定处理逻辑,获取调用相关的信息,如调用地址、调用协议、调用结果等。

画像数据基于调用地址、访问协议、调用结果的特征提取来确定目标服务。

调用地址:以类URI格式表示

http/https服务(业务/代理服务):http://

关系型数据库(数据源服务):jdbc:

非关系型数据库或缓存(数据源服务):

消息队列(消息服务):mq:

访问协议:某种访问动作。例如HTTP的POST、SQL插入、发送/订阅消息、Redis的hgethashall、Mongo的Collection操作等。

访问结果特征:服务的基础栈类型、是否集群,例如Nginx、Tomcat、Apache等。

以ESClient为例,我们可以劫持TransportService的sendRequest方法,植入我们的拦截代码逻辑。

与服务画像不同的是,客户端画像发生在具体客户端调用过程中,并非在应用的启动环节。

画像存储结构

画像存储按以下结构分层存储:

StandardProfileRespository存储某个应用的整个画像;

StandardProfileElement存储某类组件画像(服务端、客户端、日志、jar等);

ProfileElementInstance存储某类组件当中的某一个组件画像,以服务组件画像为例,如:如组件JAXRS、Servlets各为一个ProfileElementInstance,但它们同属于服务组件这一StandardProfileElement.

DataObserver提供了JMX和HTTP两种模式来暴露接口画像数据,这一点与实时数据类似,在我们MOF系列的兄弟篇《中间件增加框架之CaptureFramework》中已经详细介绍过,在此处不再赘述。

作者:李兴胜

宜信技术学院

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72860.html

相关文章

  • UAVStack的慢SQL数据库监控功能及其实现

    摘要:页面展示的统计追踪等信息则通过的接口获取四功能展示数据库监控目前已实现的功能有分类统计数据库连接池监控慢耗时分布统计慢统计慢追踪以及调用链日志关联功能。 作者: 王林林 出处:UAVStack智能运维 来源:宜信技术学院技术沙龙001期|AI中台:一种敏捷的智能业务支持方案|宜信技术沙龙 3月28日晚8点线上直播,点击报名 UAVStack是一个全维监控与应用运维平台。UAV.Mon...

    luodongseu 评论0 收藏0
  • 间件增强框架-CaptureFramework框架

    摘要:本文为大家讲解中的框架。在系统中,中间件增强框架探针提供了应用画像及性能数据收集等功能,其中数据收集功能主要采集四类数据实时数据画像数据调用链接数据生成以及线程数据分析数据。提供服务,供后续抓取使用,其中服务注册了三个,分别为。 本文为大家讲解MOF中的CaptureFramework框架。该框架提供统一的数据抓取行为和生成抓取结果能力,实现实时数据采集。 背景 应用服务监控是智能运维...

    zhaofeihao 评论0 收藏0
  • React系列 Redux 架构模式

    摘要:原文地址没想到这篇文章这么晚才出,最近发生了太多的事情,已致于心态全无,最终也离开了现在的公司,没想到是这么的狼狈一个人的光芒可以放到很大也可以小到微乎其微,如果不能好好的规划最终也只能默默的承受世上没有相同的感同身受,感受真实才能真正的 原文地址:https://gmiam.com/post/react-... 没想到这篇文章这么晚才出,最近发生了太多的事情,已致于心态全无,最终也离...

    xfee 评论0 收藏0
  • 前端每周清单第 50 期: AngularJS and Long Term Support, Web

    摘要:在该版本发布之后,开发团队并不会继续发布新的特性,而会着眼于进行重大的错误修复。发布每六个星期,团队就会创建新的分支作为发布通道,本文即是对新近发布的版本进行简要介绍。 showImg(https://segmentfault.com/img/remote/1460000013229009); 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热...

    DobbyKim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<