几种监测类型的实现技术
近几年的趋势主要是从web app的自动化测试,web app的性能监测,native app的自动化测试 最后到native app的性能监测;

图1.0 监测类型的演进

1、web app性能监测
整套监测系统能够保证采集到web端到服务器端的性能数据,如下图所示大体上将整个监测流程分成三个重要环节,它们分别为前端性能监测,网络层性能监测,系统/应用性能监测;

图1.1 wap性能监测的原理

1.1、每个环节都有它独有的性能特点和监测数据采集方法;

1.1.1、前端性能监测
该环节的性能监测主要从终端用户可感知的角度来进行,采集和监测直接影响用户体验的性能指标;其中可采集的性能指标主要有;
1)webview渲染时间
2)webview内容下载时间
3)webview事件交互时间
4)webview开启cache前后效果对比
5)webview开启html5特性前后效果对比
6)其他…
主要的技术实现有以下几种;
1)通过采集webview原生事件指标(webview的接口 WebViewClient中的onPageXXX方法,PictureListener中的onNewPicture方法)
2)通过在webview中注入js的方式获取js事件指标(DOMContentLoaded事件,load事件)
3)通过在webview中注入js的方式获取首屏时间(firstscreen)指标(在DOMContentLoaded事件的callback中添加自定义的firstscreen()方法,并在load事件触发时计算出首屏时间)
4)开启和关闭webview的cache来获取带缓存和不带缓存的性能指标;
5)开启和关闭localstorage特性来获取html5特性数据;

1.1.2、网络层性能监测
该环节的性能监测主要从网络和链路的角度来进行,采集和监测直接影响网络数据传输的性能指标;其中可采集的性能指标主要有;
1)dns时间
2)连接建立时间
3)发送请求时间
4)首包时间
5)连接关闭时间
6)等待事件
7)其他…
主要的技术实现方法;
1)使用tcpdump采集,从webview发起目标url的http请求开始,到webview完全加载完成页面这个时间段内客户端与服务器交互的所有网络数据报文;
2)通过解析tcpdump采集的pcap文件,获取单次url访问过程中产生的所有http请求的网络性能数据;

1.1.3、系统/应用性能监测
该环节的性能监测主要是从服务器端的响应和Http返回头来进行,采集和监测服务器端返回的http头部指标;其中可采集的指标主要有;
1)服务器响应性能指标;
2)http返回状态码;
3)http-header的各种选项数据;
4)内网响应性能;
5)其他…
主要的技术实现方法;
1)采集并分析与目标url服务器同主域的资源链接的网络层数据;
2)采集并分析http-header的各种选项,比如是否开启并使用cache-control,etag,gzip,chunk等提升应用性能的选项;

1.2、web app/native app的监测系统实现框架
如下图所示,整套监测系统主要分成任务层,监测层,采集层和解析层4个维度,其中数据采集的方式使用上面提到的各种技术;

图1.2 移动wap/app监测系统框架

1.3、web app监测客户端的技术
主要实现的功能:
1)网络探测和其他(包含上百个shell命令,根据服务器下发的任务远程客户端执行对应的网络探测任务ping,tracert,dig,nslookup等)
2)即时性能监测(通过tcpdump抓取网络报文数据,通过webview的事件接口和js注入方式获取浏览器的交互数据)
3)智能的任务执行(根据用户所处的场景判断和筛选任务执行、根据手机网络状态判断和筛选任务执行、JS注入)
整体框架如下图所示;

图1.3 wap监测客户端框架

1.4、其他监测方法
1)在服务端使用phantomjs+设置移动ua的方式来模拟移动设备访问web的场景;
2)JS方式监测移动网页性能(浏览器支持),使用window.performance.timing.xxx获得各种网络层指标;

2、native app性能监测
navie app性能监测;这里使用两种解决方法;

2.1、第一种方法;
对robotium进行二次开发,在instrumentationrunner中增加底层系统性能指标和tcpdump数据的采集,通过分析采集自自动化app测试过程中产生的性能数据,定位app的性能瓶颈;
下图展示了Native APP监测工具(Android)的整体实现框架,可以实现activity的启动时间、事务、性能监测;

图2.1 native app自动化监测工具整体框架

localPC和Runner分别为部署在pc和android设备中的客户端,它们之间通过Messager进行通信;Messager在这里起到了命令接收、命令转换、数据接收、数据转换的作用;其中pc与android设备通过adb forward开启双方端口并建立socket连接;细节如下图所示;

图2.2 native app自动化监测工具细节框架

2.2、第二种方法;
sdk的方式,使用java asm和instrumention库,从java字节码层面hook住关心的性能指标,比如,sqllite的io性能,httpconnection api的性能,http的错误码,activity的性能,activity中函数栈的调用性能等指标,通过分析这些数据帮助开发者快速定位app的性能瓶颈;
sdk的实现框架如下图所示,sdk主要采集到的数据;
1)各种系统信息
2)各种activity method数据
3)网络数据
4)SQL查询数据
5)各种异常数据
6)activity中函数栈的调用数据
7)位置信息

下面的图展示了sdk agent的性能数据采集原理;

图2.3 sdk agent部分的框架

通过对newlic的android sdk逆向工程,完全山寨了一个功能同newlic的app监测工具,能够采集到以上所述的所有数据;(注:仅用于技术研究和交流不涉及商业运作);
开源地址:https://github.com/fifa2002nb/xxxrelic
eclipse插件在线安装地址:http://www.apmbe.com:8070/android

下节将从移动应用监测模式趋势的角度介绍监测工具和技术,未完待续…