InspectIT_EUM 实现原理概述
实现原理概述:

实现原理详解:
1.jsAgent如何注入到浏览器
通过ASM框架修改HttpService.service()方法,加入相关逻辑,对每一个Http请求进行过滤:
A:如果是自身上报采集到数据的Http请求,将将请求转到自身数据处理的方法。
B:如果是自身的获取jsAgent资源文件的Http请求,则将请求转发到对应的处理逻辑中,根据请求信息,动态的生成对应js文件,并写入到浏览器中。
C:对于其它的正常的业务请求,则在正常响应的基础上,加上注入相关的逻辑
注入的基本步骤:
通过ASM框架动态生成HttpResponse,以及HttpResponse中的输出流 PrintWrite和OutputStream的包装类,在包装类的write方法中增加 StreamedHtmlScriptInjector.performInjection(CharSequence htmlData),在该方法中解析要输出的Html代码,找到<head>标签作为插入点,插入<script>标签:

浏览器解析html,根据<script>标签中的src属性的值,发起Http请求从服务端获取jsAgent,这个请求会分发到EUMInstrumentatoinHook.sendScript(WHttpservletResponse res, String activeModules),该方法会根据配置信息生成js文件,并 写入到浏览器,至此js注入完成。
2.如何采集数据:
jsAgent写入浏览器后,会直接开始执行采集的方法,主要的方式为调用浏览器线相关的API来获取对应的信息,以请求响应时间为例:
//force the beacon service to wait until we have collected the data
inspectIT.pageLoadRequest.require("navigationTimings"); var onLoadCallback = inspectIT.instrumentation.disableFor(function(){ //setTimeout is necessary as the load event also impacts the navigation and resource timings
setTimeout(inspectIT.instrumentation.disableFor(function(){ inspectIT.pageLoadRequest.navigationTimings = inspectIT.pageLoadRequest.navigationTimings || {}; inspectIT.pageLoadRequest.setEnterTimestamp(window.performance.timing.navigationStart);
inspectIT.pageLoadRequest.setDuration(window.performance.timing.loadEventEnd - window.performance.timing.navigationStart);
for (var key in window.performance.timing) {
// this is really sad but otherwise toJSON doesn't work in all browsers
inspectIT.pageLoadRequest.navigationTimings[String(key) + "W"] = window.performance.timing[key];
} inspectIT.pageLoadRequest.markComplete("navigationTimings");
}), 100);
}); window.addEventListener("load", onLoadCallback); });
调用了浏览器Navigation Timing系列中的属性,获取到对应的信息,其它指标的采集也是类似的通过调用浏览器对应的API获取基本信息后进行一定的整合。
3.采集哪些指标
/**
* Enum values for all existing JS modules.
*/
BROWSERINFO_MODULE('m', "plugins/browsermetainfo.js", "Browser Meta-Info Capturing", "When enabled, the browser alongside with additional meta information of users is captured."), /**
* Module for tracking AJAX requests.
*/
AJAX_MODULE('a', "plugins/ajax.js", "AJAX Capturing Module", "This module is responsible for capturing AJAX requests."),
/**
* Module for instrumenting asynchronous JS functions.
*/
ASYNC_MODULE('b', "plugins/async.js", "Async Module", "This module instruments asynchronous Javascrpt functions like setTimeout. This helps the JS Agent to be more precise with bundling user actions. This module has no impact on other Scripts using such functions."),
/**
* Module for instrumenting listener functions on HTML Elements.
*/
LISTENER_MODULE('l',
"plugins/listener.js",
"Listener Instrumentation Module",
"This module instruments the addListener functions for DOM elements and therefore is able to capture User actions like a Click or something similar. Like the asynchronous module this one also has no impact on your own Scripts."),
/**
* Speedindex module.
*/
SPEEDINDEX_MODULE('r', "plugins/rum-speedindex.js", "Speed Index Module",
"This module handles the calculation of the RUM speed index. See: https://github.com/WPO-Foundation/RUM-SpeedIndex/"),
/**
* Navigation timings API module.
*/
NAVTIMINGS_MODULE('1', "plugins/navtimings.js",
"Navigation Timings Module",
"This module deals with the collection of data captured by the Navigation Timings API. See: https://www.w3.org/TR/navigation-timing/ for further information."),
/**
* Resource timings API module.
*/
RESTIMINGS_MODULE(
'2', "plugins/restimings.js", "Resource Timings Module",
"This module deals with collecting Resource timings provided by the Resource Timings API. See: https://www.w3.org/TR/resource-timing/ for further information.");
Navigation timing中的属性:

Navigation timing中属性的含义:

4.数据是如何上报的:
jsAgent采集到的数据,通过 Ajax异步请求发送到InspectIT的Agent端,这个请求在HttpServlet.service()方法中被识别,注入到处理数据上报的逻辑中来,最终发送到CMR。
数据上报的格式:

具体格式:

(以上,祝愉快!)
InspectIT_EUM 实现原理概述的更多相关文章
- linux软中断与硬中断实现原理概述
linux软中断与硬中断实现原理概述. 1.软中断通过open_softirq注册一个软中断处理函数,即在软中断向量表softirq_vec数组中添加新的软中断处理action函数. 2.调用rais ...
- MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义
编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...
- nvGRAPH原理概述
nvGRAPH原理概述 nvGRAPH的API参考分析. 简介 数据分析是高性能计算的不断增长的应用.许多高级数据分析问题可以称为图形问题.反过来,当今许多常见的图形问题也可以称为稀疏线性代数.这是N ...
- kvo原理概述
kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...
- 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现
回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramew ...
- mysql之 MySQL 主从基于 GTID 复制原理概述
一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...
- MySQL 索引原理概述及慢查询优化实战
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...
- LCD常用接口原理概述
Android LCD(5) 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos 4210.exynos 4412 .e ...
- Linux的七个运行级别原理概述
所谓运行级别,简单点来说,运行级别就是操作系统当前正在运行的功能级别.级别是从0到6,具有不同的功能.这些级别定义在/ect/inittab文件中.这个文件是init程序寻找的主要文件,最先运行的服务 ...
随机推荐
- 机房合作(三):We are Team,We are Family
导读:拖拖拉拉,机房的合作也算是接近了尾声了.在这个过程中,真心是感谢我的两个组员.这个机房合作,看似简单,但我的组员给我的帮助和感动,都是不可忽略的.记得刚开始的时候,我就说过:不怕猪一样的组长,咱 ...
- iOS转场动画初探
一般我们就用两种转场push和present present /** 1.设置代理 - (instancetype)init { self = [super init]; if (self) { se ...
- 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分
题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...
- 【Luogu】P1896互不侵犯King(状压DP)
题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了…… 以后大家在做状压DP的时候一定要开long long…… 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...
- 算法复习——迭代加深搜索(骑士精神bzoj1085)
题目: Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相 ...
- 【图论】bnuoj 52810 Splitting the Empire
acm.bnu.edu.cn/v3/contest_show.php?cid=9208#problem/G [题意] 给定一个无向图,要求把这个无向图的点划分到不同的集合里,使得每个集合的点之间两两没 ...
- cf682E Alyona and Triangles
You are given n points with integer coordinates on the plane. Points are given in a way such that th ...
- JSP学习笔记(七十八):struts2中s:select标签的使用
1.第一个例子: <s:select list="{'aa','bb','cc'}" theme="simple" headerKey="00& ...
- 使用Jackson在Java中处理JSON
在工作中实际使用到Java处理JSON的情况,且有很大部分都使用的是开源工具Jackson实现的. 一.入门 Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换. ...
- [C++] 频谱图中 FFT快速傅里叶变换C++实现
在项目中,需要画波形频谱图,因此进行查找,不是很懂相关知识,下列代码主要是针对这篇文章. http://blog.csdn.net/xcgspring/article/details/4749075 ...