frontend-tracker
Version:
Monitoring frontend errors, send error to server automanticly.
2 lines • 3.87 kB
JavaScript
window.setTracker=function(e){"use strict";!function(e){function r(r){var t=r.target.tagName,o=r.target.src;if(!s.checkCrossOrigin(o,e.resource.exclude)||!e.resource)return!0;if("load"===r.type){if(e.resource.log.crossOrigin&&s.checkCrossOrigin(o,e.resource.origin)){var n=s.composeResourceErrorData("CROSS ORIGIN",t,o);a("RESOURCE",n)}}else"error"===r.type&&e.resource.log.error&&a("RESOURCE",n=s.composeResourceErrorData("LOAD ERROR",t,o))}function t(r){var t=r.target;if(!s.checkCrossOrigin(t.tracker._request_url,e.xhr.exclude)||!e.xhr)return!0;if("readystatechange"===r.type){var o=["_time_init","_time_open","_time_send","_time_load","_time_done"];if(o[t.readyState]&&(t.tracker[o[t.readyState]]=s.getTime()),4===t.readyState){t.tracker._response_data=t.responseText,t.tracker._status=t.status;var n=s.calculateTrackerTiming(t.tracker);if(e.xhr.log.crossOrigin&&s.checkCrossOrigin(t.tracker._request_url,e.xhr.origin)){var i=s.composeXHRErrorData("CORSS ORIGIN",t.tracker._request_url,{status:t.tracker._status,response:t.tracker._response_data},n);a("XHR",i)}e.xhr.log.slowRequest&&s.checkTimingSlow(n,e.xhr.timeLimit)&&a("XHR",i=s.composeXHRErrorData("SLOW REQUEST",t.tracker._request_url,{status:t.tracker._status,response:t.tracker._response_data},n))}}else"error"===r.type?(t.tracker._response_data=t.responseText,t.tracker._status=t.status,e.xhr.log.error&&a("XHR",i=s.composeXHRErrorData("ERROR",t.tracker._request_url,{status:t.tracker._status,response:t.tracker._response_data},n))):"timeout"===r.type&&(t.tracker._response_data=t.responseText,t.tracker._status=t.status,e.xhr.log.timeout&&a("XHR",i=s.composeXHRErrorData("TIMEOUT",t.tracker._request_url,{status:t.tracker._status,response:t.tracker._response_data},n)))}function a(e,r){var t=s.composeTrackerData(e,r);t.currentURL=s.getCurrentURL(),t.userAgent=s.getUserAgent(),window.setTimeout(function(){o(t)},0)}function o(r){var t=JSON.stringify(r),a=new window.XMLHttpRequest;a.open("POST",e.endpoint,!0),a.send(t)}var n=window.XMLHttpRequest;window.XMLHttpRequest.prototype.tracker={_time_init:0,_time_open:0,_time_send:0,_time_load:0,_time_done:0,_request_method:"",_request_url:"",_response_data:"",_status:""},window.XMLHttpRequest=function(){var e=new n;return e._tracker_open=e.open,e.addEventListener("error",t),e.addEventListener("timeout",t),e.addEventListener("readystatechange",t),e.open=function(r,t,a,o,n){return e.tracker._request_method=r,e.tracker._request_url=t,e.tracker._time_open=s.getTime(),e._tracker_open(r,t,a,o,n)},e};var s={getTime:function(){return(new Date).getTime()},getUserAgent:function(){return window.navigator.userAgent},getCurrentURL:function(){return window.location.href},checkCrossOrigin:function(e,r){if(e&&r){for(var t=!1,a=0;a<r.length;a++)e.match(r[a])&&(t|=!0);return!t}return!1},checkTimingSlow:function(e,r){return!!r&&(e.send>r.sned&&r.sned>0||e.load>r.load&&r.load>0||e.total>r.total&&r.total>0)},calculateTrackerTiming:function(e){return e._time_done&&e._time_load&&e._time_send&&e._time_done?{send:e._time_send-e._time_open,load:e._time_load-e._time_send,total:e._time_done-e._time_open}:{send:0,load:0,total:0}},composeTrackerData:function(e,r){return{type:e,data:r}},composeScriptErrorData:function(e,r,t,a,o){return o=o&&o.stack?o.stack.toString():"",{message:e,detail:{file:r,line:t,column:a,trace:o}}},composeXHRErrorData:function(e,r,t,a){return{message:e,detail:{request:r,response:t,timing:a}}},composeResourceErrorData:function(e,r,t){return{message:e,detail:{tagname:r,resourceURL:t}}}};window.addEventListener("error",function(r){if(!r.message)return!0;var t=s.composeScriptErrorData(r.message,r.filename,r.lineno,r.colno,r.error);s.checkCrossOrigin(r.filename,e.script.exclude)&&e.script&&a("SCRIPT",t)},!0),document.addEventListener("error",r,!0),document.addEventListener("load",r,!0)}(e)};
//# sourceMappingURL=tracker.min.js.map