前言java
在智能运维中,应用服务所使用的组件及JAR包等相关信息很是重要,这些信息可以清晰地描绘一个应用服务的骨架,咱们称这些信息为应用画像。在UAVStack中,中间件加强框架(MOF)下的InterceptFramework能够在应用启动过程当中获取画像信息。本文主要介绍InterceptFramework的架构原理和在此基础上实现的应用画像数据采集与存储。git
总体架构github
关键技术web
Javaassistredis
Hookmongodb
关键类及功能数据库
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方法。咱们能够在此方法的最后植入代码逻辑进行拦截,经过拦截能够获取到如下信息:
服务画像除了获取以上信息外,还获取应用的日志路径和所用JAR包等信息。
溯源画像采集
收集的数据有如下几种:
Client Address:直连客户端IP地址;
X-Forwarded-For:若是存在,则为代理路由地址链,则直连客户端为代理服务;
Host:代表远程主机甚至端口信息,若是直连客户端是代理服务,则Host为代理IP地址和端口;
User-Agent:代理描述,可用来区分浏览器仍是程序客户端,还能够提取不少浏览器终端信息;
UAV-Client-Src:HTTP客户端劫持加入的Header字段,用于UAV应用之间调用的拟合。
客户端画像采集
劫持经过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》中已经详细介绍过,在此处再也不赘述。
读完这篇文章,相信你们对中间件增长框架InterceptFramwork和应用画像实现过程有了必定的认识。后续咱们将继续为你们推送更多UAV技术干货,敬请期待!
UAVStack已在Github上开放源码,并提供了安装部署、架构说明和用户指南等双语文档,欢迎访问-给星-拉取~~~
扫一扫下方二维码,关注一个不会让你失望的公众号