前端进阶:FirfoxAgent 技术分享


#1

OneAPM Ct 产品主要是使用 Firefox 浏览器作为采集工具,通过实现一个 Firefox 浏览器的扩展(extension), 在访问用户网页的过程中,抓取对应的网页资源的性能数据,并为用户提供可用性,响应时间,页面字节数等数据的分析统计。

首先我们来看看当在浏览器地址栏输入一个网址后,浏览器是如何去访问这个网址的呢?

1.域名解析,通过解析域名获取所对应的 IP 地址。
2.创建连接,根据解析得到的 IP 地址,向 Web 服务器创建一个 socket 连接
3.发送请求,连接创建成功后,向Web服务器发送请求头(Request Header)
4.接收响应头,Web 服务器根据浏览器发出的请求进行处理,然后向浏览器发送响应头(Response Header)。
5.接收页面内容,浏览器继续接收页面内容,解析页面内容。
6.后续加载,根据浏览器对页面内容的解析,对每一个资源都会重复上面的过程,当然,域名解析会有缓存,也可能有长连接或者连接复用的情况。

OneAPM CT 会采集域名解析时间,创建连接时间,发送请求时间和接收响应时间等数据,也会提供响应码,资源类型,下载字节数,错误原因分析,来为用户诊断网站性能。
我们是如何实现这一功能的呢?主要是 XPCOM 技术以及对应的组件开发。

XPCOM 解决方案

Cross Platform Component Object Module (XPCOM) 是一个允许开发人员把一个大的工程划分成小的模块的框架. 这些小模块称为组件, 它们在运行时刻组装在一起。 XPCOM 的最重要的应用是 Gecko, 一个开源的, 遵循标准的 Web 浏览器和工具包。Gecko 提供了很多接口给其他组件。

而 OneAPM Ct 通过实现 Firefox 提供的 nsIHttpActivityObserver 接口来获取对应的网络时间数据。该接口提供了 Firefox 在 Http 传输过程中发生的各种消息,通过观察这些消息,就可以计算对应的网络时间。 该接口只有一个方法:

void observeActivity(
in nsISupports aHttpChannel,
in PRUint32 aActivityType,
in PRUint32 aActivitySubtype,
in PRTime aTimestamp,
in PRUint64 aExtraSizeData,
in ACString aExtraStringData);
例如:参数 in PRUint32 aActivitySubtype 会标识该消息是 Socket 消息 (主要用于计算Dns和创建连接时间)或 Http 消息(主要用于计算发送请求和接收响应时间),而参数 in PRTime aTimestamp 则表示该消息发生的时间。

那么我们又是如何控制浏览器去按照定制的方案去访问网页呢,这就是 sandbox , 我们可以通过创建一个 sandbox 对象,并调用系统提供的 Components.utils.evalInSandbox(),来执行我们的控制程序,比如获取当前页面的 Window 对象,Dom 对象 ,或者调用 Gecko 中提供的 Service 来获取浏览器的相关信息。

通过 XPCOM 解决方案,可以让 OneAPM Ct 实现对浏览器的控制以及相关数据的采集监控,通过模拟用户的访问过程,获取真实浏览器数据,为用户的网站提供稳定,可靠的监控服务。