在Git上查看 InspectIT

实现原理概述:

实现原理详解:

 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 实现原理概述的更多相关文章

  1. linux软中断与硬中断实现原理概述

    linux软中断与硬中断实现原理概述. 1.软中断通过open_softirq注册一个软中断处理函数,即在软中断向量表softirq_vec数组中添加新的软中断处理action函数. 2.调用rais ...

  2. MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义

    编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...

  3. nvGRAPH原理概述

    nvGRAPH原理概述 nvGRAPH的API参考分析. 简介 数据分析是高性能计算的不断增长的应用.许多高级数据分析问题可以称为图形问题.反过来,当今许多常见的图形问题也可以称为稀疏线性代数.这是N ...

  4. kvo原理概述

    kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...

  5. 基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现

        回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录:      src\ NDF.Data.EntityFramew ...

  6. mysql之 MySQL 主从基于 GTID 复制原理概述

    一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...

  7. MySQL 索引原理概述及慢查询优化实战

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...

  8. LCD常用接口原理概述

    Android LCD(5)  平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos 4210.exynos 4412 .e ...

  9. Linux的七个运行级别原理概述

    所谓运行级别,简单点来说,运行级别就是操作系统当前正在运行的功能级别.级别是从0到6,具有不同的功能.这些级别定义在/ect/inittab文件中.这个文件是init程序寻找的主要文件,最先运行的服务 ...

随机推荐

  1. nginx的详解(二)

    查看几个设置 nginx正则表达式常用的是前6个 ^: 匹配字符串的开始位置: $:匹配字符串的结束位置:.*: .匹配任意字符,*匹配数量0到正无穷: \. 斜杠用来转义,\.匹配 . 特殊使用方法 ...

  2. 洛谷P2351 [SDOi2012]吊灯 【数学】

    题目 Alice家里有一盏很大的吊灯.所谓吊灯,就是由很多个灯泡组成.只有一个灯泡是挂在天花板上的,剩下的灯泡都是挂在其他的灯泡上的.也就是说,整个吊灯实际上类似于[b]一棵树[/b].其中编号为 1 ...

  3. Oracle Partition 分区详细总结

    此文从以下几个方面来整理关于分区表的概念及操作:        1.表空间及分区表的概念        2.表分区的具体作用        3.表分区的优缺点        4.表分区的几种类型及操作 ...

  4. out.print和out.write

    这是一个JSP页面: <%@ page language="java" import="java.util.*"  %> <%@ page p ...

  5. day02-菜单处理

    解决力度到按钮的级别 ----------------------------------------------------------------------------------------- ...

  6. poj 2318 向量的叉积二分查找

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9350   Accepted: 4451 Description ...

  7. 使用putty上传下载文件(pscp)

    putty作为ssh工具开源免费,简单易用.可是如何使用它来上传和下载文件呢?答案在于pscp. pscp下载地址:http://www.chiark.greenend.org.uk/~sgtatha ...

  8. NOJ1203 最多约数问题 [搜索 数论]

    传送门 njczy2010 1203 Accepted 79MS   1400K 2321Byte G++ 2015-01-25 13:14:25.0 最多约数问题 时间限制(普通/Java) : 2 ...

  9. python之基本数据类型及深浅拷贝

    一.数据基本类型之set集合 set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key set集合,是一个无序且不重复的元素集合 1.创建 ...

  10. Codeforces 514C Watto and Mechanism(字典树)

    题目链接  Watto and Mechanism 题意  给出$n$个串(相当于字典),然后给出$m$个询问. 每个询问以字符串的形式给出,你需要改变这个字符串中的任意一个字符 (必须改变且只能改变 ...