在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. JavaScript onload

     The onload event occurs immediately after a page or an image is loaded.onload事件当一个页面或是一张图片加载完成时被触发. ...

  2. 九度oj 题目1335:闯迷宫

    题目描述: sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫.sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数. 知道了最少步数就可以辅助控制 ...

  3. 九度oj 题目1534:数组中第K小的数字

    题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]. 现在给你数组A和B ...

  4. DIV垂直/水平居中2(DIV宽度和高度是动态的)

    <!doctype html><html><head><meta charset="utf-8"><title>块元素D ...

  5. 【bzoj4930】棋盘 费用流

    题目描述 给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅 当满足以下两个条件: 1:x=u或y=v 2:对于(x,y)与(u,v)之间 ...

  6. 【Luogu】P3195玩具装箱(斜率优化DP)

    这题还是比较炫的 题目链接 我们设f[i]是已经装了前i个玩具,且第i个玩具是某箱子里装的最后一个东西(废话) 那我们很轻松可以想到一个转移方程 ;i<=n;++i) ;j<i;++j) ...

  7. Lucas定理详解

    这篇博客是从另一位园友那里存的,但是当时忘了写原文的地址,如果有找到原文地址的请评论联系! Lucas定理解决的问题是组合数取模.数学上来说,就是求 \(\binom n m\mod p\).(p为素 ...

  8. 洛谷 [P4035] 球形空间生成器

    高斯消元 注意浮点误差,判断一个浮点数是否为 0 的时候,看他的绝对值与 \(10^{-8}\)的关系 #include <iostream> #include <algorithm ...

  9. 乱码及restful

    1.乱码的解决--通过过滤器来解决乱码:springmvc中提供CharacterEncodingFilter解决post乱码 <filter> <filter-name>Ch ...

  10. hdu3987,最小割时求最少割边数

    题意:求最小割时候割边最少的数量.算法:先求dinic一遍,跑出残网络,再把该网络中满流量(残量为0)的边 残量改为1,其他边残量改为无穷,则再跑一次最大流,所得即为答案.(思,最小割有喝多组,但是要 ...