中间件增强框架之InterceptFramework
本文讲解MOF中的InterceptFramework框架。该框架可以在应用启动过程中获取画像信息,实现应用画像数据采集和存储。
一、前言
在智能运维中,应用服务所使用的组件及JAR包等相关信息非常重要,这些信息能够清晰地描绘一个应用服务的骨架,我们称这些信息为应用画像。在UAVStack中,中间件增强框架(MOF)下的InterceptFramework可以在应用启动过程中获取画像信息。本文主要介绍InterceptFramework的架构原理和在此基础上实现的应用画像数据采集与存储。
二、整体架构
2.1 关键技术
- Javaassist
- Hook
2.2 关键类及功能
- Profile数据和客户端监控指标主要通过InterceptSupport和hookProxy机制捕获和监控。
- Profile也会安装至DataObserver对象并暴露JMX/HTTP接口。
2.3 拦截之前的准备
- 在应用启动的特定生命周期内改写字节码,植入特定的逻辑处理代码进行拦截。
- 拦截框架对应的Supporter启动,从配置文件中获取应该装载的Listener,构建InterceptSupport实例,把Listener添加到InterceptSupport实例中。
2.4 具体的拦截逻辑
在应用启动过程中的特定生命周期,之前植入的代码拦截逻辑开始执行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类具体处理抓取的各类数据。
五、画像数据
画像数据即静态数据,是在进程启动时即可得到的数据,包括操作系统相关的信息、程序相关的信息、程序启动后相关的初始化信息。
画像数据主要包括服务画像、溯源感知画像和客户端画像三部分,如上图所示。以下分别从这三个方面介绍画像采集:
5.1 服务画像采集
服务画像描述了服务本体的信息,包括应用唯一标识(AppID)、服务名(Service ID)、服务实例的URI、服务接口的URI、服务接口的元数据(类、方法、入参出参、注解、部署描述符)。
以Tomcat为例,应用的启动过程需要经过StandardContext的start方法。我们可以在此方法的最后植入代码逻辑进行拦截,通过拦截可以获取到以下信息:
- 应用名、webworkdir(工作目录)、servletcontext、contextpath、basepath(应用实际路径)等容器上下文信息;
- 根据相应的技术规范(Servlet、JAXRS、JAXWS、Spring等)获取画像数据,主要包括:通过反射的方式获取类和方法名以及出参入参信息、扫描注解类、获取注解信息、解析部署描述符文件(web.xml等)信息。
服务画像除了获取以上信息外,还获取应用的日志路径和所用JAR包等信息。
5.2 溯源画像采集
溯源画像采集主要借助HTTP协议Header中的字段进行溯源,通过中间件劫持技术拦截Tomcat中StandardEngineValve的Invoke方法,获取溯源数据。
收集的数据有以下几种:
- Client Address:直连客户端IP地址;
- X-Forwarded-For:如果存在,则为代理路由地址链,则直连客户端为代理服务;
- Host:表明远程主机甚至端口信息,如果直连客户端是代理服务,则Host为代理IP地址和端口;
- User-Agent:代理描述,可用来区分浏览器还是程序客户端,还可以提取很多浏览器终端信息;
- UAV-Client-Src:HTTP客户端劫持加入的Header字段,用于UAV应用之间调用的拟合。
5.3 客户端画像采集
客户端画像通过对一系列常用中间件客户端进行劫持实现,目前已支持同步/异步http、数据库jdbc、redis(jedis,aredis,lettuce)、mongodb、rocketmq/rabbitmq/Kafka、ESClient等。
劫持通过javaassist字节码改写、动态代理等AOP技术,在客户端调用代码中嵌入特定处理逻辑,获取调用相关的信息,如调用地址、调用协议、调用结果等。
画像数据基于调用地址、访问协议、调用结果的特征提取来确定目标服务。
1)调用地址:以类URI格式表示
- http/https服务(业务/代理服务):http://
- 关系型数据库(数据源服务):jdbc:
- 非关系型数据库或缓存(数据源服务):
- 消息队列(消息服务):mq:
2)访问协议:某种访问动作。例如HTTP的POST、SQL插入、发送/订阅消息、Redis的hgethashall、Mongo的Collection操作等。
3)访问结果特征:服务的基础栈类型、是否集群,例如Nginx、Tomcat、Apache等。
- 以ESClient为例,我们可以劫持TransportService的sendRequest方法,植入我们的拦截代码逻辑。
与服务画像不同的是,客户端画像发生在具体客户端调用过程中,并非在应用的启动环节。
六、画像存储结构
画像存储按以下结构分层存储:
- StandardProfileRespository存储某个应用的整个画像;
- StandardProfileElement存储某类组件画像(服务端、客户端、日志、jar等);
- ProfileElementInstance存储某类组件当中的某一个组件画像,以服务组件画像为例,如:如组件JAXRS、Servlets各为一个ProfileElementInstance,但它们同属于服务组件这一StandardProfileElement.
DataObserver提供了JMX和HTTP两种模式来暴露接口画像数据,这一点与实时数据类似,在我们MOF系列的兄弟篇《中间件增加框架之CaptureFramework》中已经详细介绍过,在此处不再赘述。
开源地址:https://github.com/uavorg
作者:李兴胜
来源:宜信技术学院
中间件增强框架之InterceptFramework的更多相关文章
- 中间件增强框架之-CaptureFramework框架
一.背景 应用服务监控是智能运维系统的重要组成部分.在UAV系统中,中间件增强框架(MOF)探针提供了应用画像及性能数据收集等功能,其中数据收集功能主要采集四类数据:实时数据.画像数据.调用链接数据生 ...
- hibernate 入门([数据访问中间件] 开源框架)
1.内容: hibernate 也是一个经典的[数据访问中间件] 开源框架. 2.hibernate核心组件 SessionFactory[整个数据的操作]重量级组件 ...
- MyBatis-Pro,新一代的MyBatis增强框架
框架功能 内置提供基础CRUD方法 提供根据方法名自进行单表查询(包括查询.统计.删除等) 接入方法 Spring Boot <dependency> <groupId>com ...
- UAVStack的慢SQL数据库监控功能及其实现
UAVStack是一个全维监控与应用运维平台.UAV.Monitor具备监控功能,包含基础监控.应用/服务性能监控.日志监控.业务监控等.在应用监控中,UAV可以根据应用实例画像:其中应用实例组件可以 ...
- 调用链系列(1):解读UAVStack中的贪吃蛇
一.背景 对于分布式在线服务,一个请求需要经过多个系统中多个模块,可能多达上百台机器的协作才能完成单次请求.这种场景下单靠人力无法掌握整个请求中各个阶段的性能开销,更无法快速的定位系统中性能瓶颈.当发 ...
- 调用链系列(3):如何从零开始捕获body和header
拓展阅读:调用链系列(1):解读UAVStack中的贪吃蛇 调用链系列(2):轻调用链实现 在Java中,HTTP协议的请求/响应模型是由Servlet规范+Servlet容器(如Tomcat)实现的 ...
- UAVStack JVM监控分析工具:图形化展示采集及分析监控数据
摘要:UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据:同时提供JVM基本参数获取.内存dump.线程分析.内存分配采样和热点方法分析等功能. 引言 ...
- 汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
转自:http://www.51testing.com/html/83/n-3718883.html 有人认为编程是一门技术活,要有一定的天赋,非天资聪慧者不能及也.非也,这是近几年,对于技术这碗饭有 ...
- django框架--中间件系统
目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...
随机推荐
- ~~函数基础(七):生成器&迭代器~~
进击のpython 生成器 上来说个这,就有点抽象了! 我们先整点活儿 宁,准备好了吗? 直接相位猛冲! 列表生成器 需求来了,老弟!我有一个数组 a = [1, 2, 3, 4, 5, 6, 7, ...
- 【AI】Android Pie中引入的AI功能
前言 “无AI,不未来”,绝对不是一句豪情壮语,AI早已进入到了我们生活当中.去年Google发布的Android Pie系统在AI功能方面就做了重大革新,本文就对Google在新系统中引入的AI功能 ...
- 【译】.NET Core 3.0 发布自包含单体可执行程序
.NET Core 提供的发布应用程序选项 self-contained 是共享应用程序的好方法,因为应用程序的发布目录包含所有组件.运行时和框架.您只需要告诉使用者应用程序的入口 exe 文件,就可 ...
- TLS示例开发-golang版本
目录 前言 制作自签名证书 CA 服务器证书相关 客户端证书相关 证书如何验证 在浏览器中导入证书 导入证书 修改域名 golang服务端 目录 main.go 测试 参考 前言 在进行项目总结的时候 ...
- python 写入excel数据而不改变excel原有样式
目标:python写数据到excel,不改变原有样式 解决:在打开excel时,加入该参数formatting_info=True
- Python入门基础(8)
上一篇介绍了一些python中函数的基本用法,那么,现在就来谈一谈python中的一些内置函数吧 python中的内置函数 1.map()函数 map()函数接受两个参数值,一个是函数,一个是Iter ...
- 五分钟了解Zabbix
Zabbix-简介 Zabbix概念 Zabbix组成 Server Zabbix server 是 Zabbix agent 向其报告可用性.系统完整性信息和统计信息的核心组件.是存储所有配置信息. ...
- markdown插入表格语法
markdown插入表格语法 举例 如表格标题为,姓名,班级,成绩 标题内的内容为,yang,a班,100 我们要在markdow文件中插入表格 如 姓名|班级|成绩 -|-|- yang|a班|10 ...
- [leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)
原题地址 思路: 和leetcode105题差不多,这道题是给中序和后序,求出二叉树. 解法一: 思路和105题差不多,只是pos是从后往前遍历,生成树顺序也是先右后左. class Solution ...
- 2017day2
系统模块: # Author: sonny# -*- coding:utf-8 -*-import sys; #print(sys.path);print(sys.argv);print(sys.ar ...