148 lines
5.0 KiB
JavaScript
148 lines
5.0 KiB
JavaScript
|
|
(function () {
|
|
var _XM_TID = '%{XM_TID}';
|
|
var _XM_TRACE_ELAPSE = '%{XM_TRACE_ELAPSE}';
|
|
var _XM_CLIENT_API = '_XM_CLIENT_API%{XM_CLIENT_API}';
|
|
var _XM_CLIENT_ADDR = '%{XM_CLIENT_ADDR}';
|
|
var _XM_TID_HEADER = 'X-Xm-Tid';
|
|
var _XM_TRACE_ELAPSE_HEADER = 'X-Xm-ElapseTime';
|
|
|
|
|
|
var openProxied = window.XMLHttpRequest.prototype.open;
|
|
window.XMLHttpRequest.prototype.open = function () {
|
|
if (arguments[1].indexOf(_XM_CLIENT_API) == -1) {
|
|
if (document.removeEventListener) {
|
|
this.removeEventListener("loadstart", _xm_loadstart);
|
|
this.removeEventListener("loadend", _xm_loadend);
|
|
}
|
|
else {
|
|
this.detachEvent("loadstart", _xm_loadstart);
|
|
this.detachEvent("loadend", _xm_loadend);
|
|
}
|
|
if (this.addEventListener) {
|
|
this.addEventListener("loadstart", _xm_loadstart);
|
|
this.addEventListener("loadend", _xm_loadend);
|
|
}
|
|
else if (this.attachEvent) {
|
|
this.attachEvent("onloadstart", _xm_loadstart);
|
|
this.attachEvent("onloadend", _xm_loadend);
|
|
}
|
|
}
|
|
return openProxied.apply(this, [].slice.call(arguments));
|
|
};
|
|
|
|
var _xm_loadstart = function () {
|
|
var eventProxied = this.onreadystatechange;
|
|
this.onreadystatechange = function () {
|
|
if (this.readyState === XMLHttpRequest.DONE) {
|
|
this._xm_clientinfo.es = Date.now();
|
|
}
|
|
|
|
if (eventProxied != null && typeof eventProxied != 'undefined') {
|
|
eventProxied.apply(this, [].slice.call(arguments));
|
|
}
|
|
|
|
if (this.readyState === XMLHttpRequest.DONE) {
|
|
this._xm_clientinfo.ee = Date.now();
|
|
}
|
|
};
|
|
this._xm_clientinfo = __xm_create_clientinfo();
|
|
this._xm_clientinfo.ss = Date.now();
|
|
this._xm_clientinfo.se = Date.now();
|
|
};
|
|
|
|
var _xm_loadend = function () {
|
|
if (typeof this._xm_clientinfo == 'undefined') return;
|
|
if (this._xm_clientinfo.es == 0) {
|
|
this._xm_clientinfo.es = Date.now();
|
|
this._xm_clientinfo.ee = Date.now();
|
|
}
|
|
this._xm_clientinfo.tid = this.getResponseHeader(_XM_TID_HEADER);
|
|
var traceElapseTime = this.getResponseHeader(_XM_TRACE_ELAPSE_HEADER);
|
|
|
|
if (typeof traceElapseTime == 'undefined' || typeof this._xm_clientinfo.tid == 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (traceElapseTime > this._xm_clientinfo.ee - this._xm_clientinfo.ss) {
|
|
return;
|
|
}
|
|
|
|
var _xm_clientinfo = this._xm_clientinfo;
|
|
__xm_send_post(_xm_clientinfo);
|
|
};
|
|
|
|
function __xm_create_clientinfo() {
|
|
var clientinfo = {};
|
|
clientinfo.tid = 0;
|
|
clientinfo.ss = 0;
|
|
clientinfo.se = 0;
|
|
clientinfo.es = 0;
|
|
clientinfo.ee = 0;
|
|
return clientinfo;
|
|
}
|
|
|
|
function __xm_send_post(clientinfo) {
|
|
try{
|
|
var queryParameters = 'tid=' + clientinfo.tid + '&ss=' + clientinfo.ss + "&se=" + clientinfo.se;
|
|
queryParameters += '&es=' + clientinfo.es + "&ee=" + clientinfo.ee;
|
|
|
|
var xmlhttp;
|
|
if (window.XMLHttpRequest) {
|
|
xmlhttp = new XMLHttpRequest();
|
|
} else {
|
|
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
|
|
}
|
|
|
|
if(_XM_CLIENT_ADDR == "") {
|
|
xmlhttp.open('GET', './'+_XM_CLIENT_API+'?' + queryParameters, true);
|
|
}else{
|
|
xmlhttp.open('GET', 'http://' + _XM_CLIENT_ADDR + '/' + _XM_CLIENT_API + '?' + queryParameters, true);
|
|
}
|
|
|
|
xmlhttp.send(null);
|
|
|
|
if (true) {
|
|
var sendElapseTime = clientinfo.se - clientinfo.ss;
|
|
var recvElapseTime = clientinfo.ee - clientinfo.es;
|
|
var serverElapseTime = clientinfo.es - clientinfo.se;
|
|
|
|
console.log('__xm_send_post serverElapseTime=' + serverElapseTime + ', sendElapseTime=' + sendElapseTime + ', recvElapseTime=' + recvElapseTime);
|
|
}
|
|
}
|
|
catch(e) {
|
|
console.log(e);
|
|
}
|
|
}
|
|
|
|
var _xm_window_load = function () {
|
|
//return;
|
|
setTimeout(function () {
|
|
var timing = window.performance.timing;
|
|
var clientinfo = __xm_create_clientinfo();
|
|
clientinfo.ss = timing.navigationStart;
|
|
clientinfo.se = timing.connectEnd;
|
|
clientinfo.es = timing.responseEnd;
|
|
clientinfo.ee = timing.loadEventEnd;
|
|
clientinfo.tid = _XM_TID;
|
|
|
|
if (_XM_TRACE_ELAPSE > clientinfo.ee - clientinfo.ss) {
|
|
return;
|
|
}
|
|
|
|
__xm_send_post(clientinfo);
|
|
}, 0);
|
|
};
|
|
|
|
if (!window.performance || !window.performance.timing) {
|
|
return;
|
|
}
|
|
|
|
if (this.addEventListener) {
|
|
this.addEventListener("load", _xm_window_load);
|
|
}
|
|
else if (this.attachEvent) {
|
|
this.attachEvent("onload", _xm_window_load);
|
|
}
|
|
})();
|