<h1>analytics.js: Track JavaScript, AngularJS and jQuery errors with Google Analytics</h1>
Generate an error:
<!-- BUTTONS -->
<div class="btn-group">
<button class="btn btn-default js-error" type="button">Pure JavaScript</button>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.13/angular.js"></script>
<button ng-app="loggerApp" ng-controller="loggerController" class="btn btn-default" ng-click="generateAngularError()" type="button">AngularJS</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<button class="btn btn-default jquery-error" type="button">jQuery</button>
<button class="btn btn-default jquery-ajax-error" type="button">jQuery Ajax</button>
</div>
<!-- DEVELOPER CONSOLE OUTPUT TO HTML -->
<div class="light-theme">
[[[https://codepen.io/malyw/pen/vExwoK]]]
</div>
<!-- GOOGLE ANALYTICS ANALYTICS.JS-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-53471595-11', 'auto');
ga('send', 'pageview');
</script>
/*--- GENERATE ERRORS ---*/
// Generate Pure JS error
document.querySelector('.js-error')
.addEventListener('click', function () {
unicorn();// is not defined- triggers an error
});
// Generate AngularJS error
angular.module('loggerApp', [])
.controller('loggerController', function ($scope) {
$scope.generateAngularError = function () {
angularUnicorn();// is not defined- triggers an error
};
});
// Generate jQuery error
$('.jquery-error').on('click', function () {
$.error("$.error is called");// https://api.jquery.com/jquery.error/
});
// Generate jQuery Ajax error
$('.jquery-ajax-error').on('click', function () {
$.get('some-not-existed-url');
});
/*--- ERROR HANDLERS ---*/
// Pure JavaScript errors handler
window.addEventListener('error', function (err) {
console.log('JavaScript Error:');
console.error({
message: err.message,
filename: err.filename,
line: err.lineno,
column: err.colno// might not be present
});
var lineAndColumnInfo = err.colno ? ' line:' + err.lineno +', column:'+ err.colno : ' line:' + e.lineno;
ga(
'send',
'event',
'JavaScript Error',
err.message,
err.filename + lineAndColumnInfo + ' -> ' + navigator.userAgent,
0,
true
);
});
// AngularJS errors handler
angular.module('loggerApp')
.config(function ($provide) {
$provide.decorator("$exceptionHandler", function ($delegate) {
return function (exception, cause) {
$delegate(exception, cause);
console.log('AngularJS error:');
console.error({
msg: exception.message,
stack: exception.stack
});
ga(
'send',
'event',
'AngularJS error',
exception.message,
exception.stack,
0,
true
);
};
});
});
// jQuery errors handler (jQuery API)
jQuery.error = function (message) {
console.log('jQuery Error:');
console.error(message);
ga(
'send',
'event',
'jQuery Error',
message,
navigator.userAgent,
0,
true
);
}
// jQuery AJAX errors handler (jQuery API)
$(document).ajaxError(function (event, request, settings) {
// console.log(e, request, settings);
console.log('jQuery Ajax Error:');
console.error({
url: settings.url,
result: event.result,
status: request.status,
statusText: request.statusText,
type: settings.type,
crossDomain: settings.crossDomain,
dataType: settings.dataType
});
ga(
'send',
'event',
'jQuery Ajax Error',
settings.url,
JSON.stringify({
result: event.result,
status: request.status,
statusText: request.statusText,
crossDomain: settings.crossDomain,
dataType: settings.dataType
}),
0,
true
);
});