SlideShare a Scribd company logo
KNOW YOUR ERRORS
BECAUSE IT'S A JUNGLE OUT THERE
WHO AM I?
Diogo Antunes
Booking.com
Senior Client Side Developer
@dicode
OVERVIEW
logging JS errors
proof of concept
tools/services
SO WHY LOG JS ERRORS IF?
YOU DO TDD
YOU DO SELENIUM TESTS
YOU DO HEADLESS BROWSER TESTING
YOU HAVE A TESTING TEAM
IT WORKS ON MY MACHINE
IT'S A JUNGLE OUT THERE!
3RD PARTY SCRIPTS THAT YOU DON'T CONTROL
Twitter, Facebook, GA
YOU USE A CDN
even if it is just to load jquery
USERS INSTALL PLUGINS
YOUR MARKETING DEPARTMENT LIKES TRACKING PIXELS
YES, SOME THINGS YOU CANNOT CONTROL
but some of them you can mitigate
SOME CHALLENGES
LOCALIZED MESSAGES
Expected identifier, string or number
Identificador esperado
Se esperaba un identificador, una cadena o un número
Bezeichner erwartet
标识
‫ّف‬ ‫د‬ ‫و‬ ‫ا‬
LINE NUMBER
minify js
using gzip and preserving new lines may be a temporary solution
CRYPTIC MESSAGES
cannot find method of undefined
Script error.
cross origin domain policy
Chrome and Firefox
Access-Control-Allow-Origin: *
BE SAFE
deploy environment vars that disable 3rd party code
if possible, without making any deploy to live
that way you can take action quickly
LET'S DO SOME LOGGING
APPROACHES
WINDOW.ONERROR
works across the board
amount of information is limited
window.onerror = function(msg, url, lno){
/*
No impact besides parsing
overhead is only for the request to log the error
when one actually happens
*/
return true; //hides the message in supported browsers
};
TRY/CATCH
works across the board
try {
throw new Error("my error");
} catch (e){
e.stack; //chrome, firefox
e.message; //opera
log(e.stack || e.message || e);
}
TRY/CATCH
more meaningful errors
performance hit, but you should evaluate if it matters
may lead to a lot of nesting if not thought through
var fn = function(){
throw "new error"; //this exception will not be caught
//since it's a string it will not have stack trace
};
try{
setTimeout(fn,0);
} catch(e) { }
TYPES OF EXCEPTIONS
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
LOGGING
GET VS POST
both methods work fine
get has the size of url limitation
you can truncate some data (case by case evaluation)
IMAGE (GET)
//assuming src was already calculated
var img = new Image(1,1);
img.onload = function() {};
img.src = "/log?msg=error&url=http%3A%2F%2Flocalhost&lno=1";
IFRAME (POST)
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var iframeDoc = iframe.contentDocument,
content = '<form method="post" action="/log">
<input type="text" name="msg" value="Script Error">
<input type="text" name="url" value="http%3A%2F%2Flocalhost">
<input type="text" name="lno" value="1">
</form>';
iframeDoc.open();
iframeDoc.write(content);
iframeDoc.close();
iframeDoc.body.firstChild.submit();
XHR (BOTH)
var xhr = new XMLHttpRequest();
//post
xhr.open("POST",'/log');
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send( payload );
//get
xhr.open("GET",'/log?' + qs);
xhr.send();
IF YOU WANT JUST A COUNTER
Google Analytics is also an option
_gaq.push([
'_trackEvent',
'jserror',
url + ':' + lno,
message || ''
]);
STACKTRACE.JS
<script src="path/to/stacktrace.js"></script>
<script>
</script>
//... your code ...
if (errorCondition) {
var trace = printStackTrace();
//Output however you want!
alert(trace.join('nn'));
}
//... more code of yours ...
STACKTRACE.JS
Firefox (and Iceweasel) 0.9+
Google Chrome 1+
Safari 3.0+ (including iOS 1+)
Opera 7+
IE 5.5+
Konqueror 3.5+
Flock 1.0+
SeaMonkey 1.0+
K-Meleon 1.5.3+
Epiphany 2.28.0+
Iceape 1.1+
YOUR DASHBOARD
NODEJS + REDIS
express
node_redis
npm install -g express
express dashboard_js
npm install redis
EXPRESS
//assuming a sample express app
var log = require('./routes/log');
app.get('/log', log.index);
app.post('/log', log.index);
app.get('/log_list', log.list);
app.get('/log_chart', log.chart);
THE ROUTERS
exports.index = function (req, res) {
var msg = req.param('msg', ''),
url = req.param('url', ''),
lno = req.param('lno', 0),
js_error = msg + ':!:' + url + ':!:' + lno;
minute = ((+new Date()/60000|0)*60000),
data = [ 'jserrors', '' + minute, 1 ];
if(!msg) {
res.send('', 400);
}
redis_cli.hincrby( data, function(){} );
redis_cli.lpush( 'jserror_' + minute, js_error);
res.send('', 202);
};
exports.list = function(req, res) {
var to = (+new Date()/60000|0)*60000,
from = to - 20 * 60000;
inc = 60000,
prefix = 'jserror_',
result = {},
cb = function(res, i){.
return function(err, reply){
var ret = [];
reply.forEach(function(val, ind){
ret[ind] = val.split(':!:');
});
result[i] = ret;
if(i === to) {
res.json(result);
}
};
};
for(var i = from; i<=to; i+=inc) {
redis_cli.lrange( [prefix+i,0,100], cb(res, i) );
}
};
exports.chart = function(req, res) {
var to = (+new Date()/60000|0)*60000, inc = 60000,
from = to - 20 * 60000,
redis_param = ['jserrors'],
ret = [];
for(var i = from; i<=to; i+=inc) {
redis_param.push(''+i);
ret.push({d: new Date(i)});
}
redis_cli.hmget( redis_param, function(err, reply){
reply.forEach(function(val, ind){
ret[ind].v = val || 0;
});
res.json(ret);
});
};
MISCELLANEOUS
jquery 2.0
twitter bootstrap
morris
IN ACTION
SERVICES OUT THERE
Smart error grouping
Team collaboration
Easiness of integration
Users statistics
QBAKA
Smart grouping of errors
We don't rewrite your code
Automatic ignoring of errors
Filter errors to your liking
{ERRORCEPTION}
you can point it to your own service
or use appspot
more a service than a SAAS
JSERRLOG
Low overhead
Email digest
Shows the JavaScript code that caused the error
Automatic cleanup
MUSCULA
SINCE WE ALREADY LOGGING
Navigation Timing API
not available - Opera, Safari
PROPERTIES
navigationStart
unloadEventStart
unloadEventEnd
redirectStart
redirectEnd
fetchStart
domainLookupStart
domainLookupEnd
connectStart
connectEnd
PROPERTIES
secureConnectionStart
requestStart
responseStart
responseEnd
domLoading
domInteractive
domContentLoadedEventStart
domContentLoadedEventEnd
domComplete
loadEventStart
loadEventEnd
VISUAL INDICATION
FRONTEND SPOF
any 3rd party widget
custom font downloading
even your own JS can cause it...
LOG EVERYTHING YOU CAN
EVERYWHERE
don't expect your users to report your errors
be aware, be prepared
THANKS!
Diogo Antunes
Booking.com jobs
Q&A
Know your errors

More Related Content

PPTX
ES6, 잘 쓰고 계시죠?
PDF
Practical JavaScript Programming - Session 8/8
PDF
Redux Thunk - Fu - Fighting with Async
PDF
FrontDays #3. Иван Федяев, Эволюция JavaScript. Обзор нововведений ECMAScript 6
PDF
Practical JavaScript Programming - Session 5/8
PDF
MeetJS Summit 2016: React.js enlightenment
ODP
Introduccion a Jasmin
PDF
PHPUnit Episode iv.iii: Return of the tests
ES6, 잘 쓰고 계시죠?
Practical JavaScript Programming - Session 8/8
Redux Thunk - Fu - Fighting with Async
FrontDays #3. Иван Федяев, Эволюция JavaScript. Обзор нововведений ECMAScript 6
Practical JavaScript Programming - Session 5/8
MeetJS Summit 2016: React.js enlightenment
Introduccion a Jasmin
PHPUnit Episode iv.iii: Return of the tests

What's hot (18)

PDF
2016 W3C Conference #4 : ANGULAR + ES6
PDF
Beautiful java script
KEY
Building @Anywhere (for TXJS)
DOCX
My java file
PDF
02 Introduction to Javascript
PPTX
Security: Odoo Code Hardening
PPT
Practical Ext JS Debugging
PDF
Asynchronous programming done right - Node.js
PPTX
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
PDF
Practical JavaScript Programming - Session 4/8
PDF
Practical
ODP
Unit testing with Easymock
PPT
Exceptions irst
PDF
OpenERP e l'arte della gestione aziendale con Python
ODP
From typing the test to testing the type
PDF
Mad Max is back, plus the rest of our new reviews and notable screenings
PDF
PHP Secure Programming
PDF
FwDays 2021: Metarhia Technology Stack for Node.js
2016 W3C Conference #4 : ANGULAR + ES6
Beautiful java script
Building @Anywhere (for TXJS)
My java file
02 Introduction to Javascript
Security: Odoo Code Hardening
Practical Ext JS Debugging
Asynchronous programming done right - Node.js
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
Practical JavaScript Programming - Session 4/8
Practical
Unit testing with Easymock
Exceptions irst
OpenERP e l'arte della gestione aziendale con Python
From typing the test to testing the type
Mad Max is back, plus the rest of our new reviews and notable screenings
PHP Secure Programming
FwDays 2021: Metarhia Technology Stack for Node.js
Ad

Similar to Know your errors (20)

PDF
To Err Is Human
PDF
Avinash Kundaliya: Javascript and WordPress
PDF
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
PDF
Bonnes pratiques de développement avec Node js
PDF
Surviving javascript.pptx
PPT
Going crazy with Node.JS and CakePHP
PDF
Advanced Jasmine - Front-End JavaScript Unit Testing
PPT
Html and i_phone_mobile-2
PPTX
Typescript barcelona
PDF
JavaScript para Graficos y Visualizacion de Datos
PDF
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
PDF
Testing in JavaScript - August 2018 - WebElement Bardejov
PDF
JavaScript para Graficos y Visualizacion de Datos - BogotaJS
PDF
Is HTML5 Ready? (workshop)
PDF
Is html5-ready-workshop-110727181512-phpapp02
PDF
Cross Domain Web
Mashups with JQuery and Google App Engine
PPTX
Compatibility Detector Tool of Chrome extensions
PDF
JavaScript Refactoring
PDF
Ten useful JavaScript tips & best practices
PPTX
Es6 hackathon
To Err Is Human
Avinash Kundaliya: Javascript and WordPress
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
Bonnes pratiques de développement avec Node js
Surviving javascript.pptx
Going crazy with Node.JS and CakePHP
Advanced Jasmine - Front-End JavaScript Unit Testing
Html and i_phone_mobile-2
Typescript barcelona
JavaScript para Graficos y Visualizacion de Datos
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
Testing in JavaScript - August 2018 - WebElement Bardejov
JavaScript para Graficos y Visualizacion de Datos - BogotaJS
Is HTML5 Ready? (workshop)
Is html5-ready-workshop-110727181512-phpapp02
Cross Domain Web
Mashups with JQuery and Google App Engine
Compatibility Detector Tool of Chrome extensions
JavaScript Refactoring
Ten useful JavaScript tips & best practices
Es6 hackathon
Ad

More from Diogo Antunes (6)

PDF
It works on your computer... but does it render fast enough?
PDF
Pocket Knife JS
PDF
PDF
Making burgers with JavaScript
PDF
Debugging your JavaScript
ODP
Working With Canvas
It works on your computer... but does it render fast enough?
Pocket Knife JS
Making burgers with JavaScript
Debugging your JavaScript
Working With Canvas

Recently uploaded (20)

PDF
Approach and Philosophy of On baking technology
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPT
Teaching material agriculture food technology
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Electronic commerce courselecture one. Pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Machine learning based COVID-19 study performance prediction
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
KodekX | Application Modernization Development
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Approach and Philosophy of On baking technology
sap open course for s4hana steps from ECC to s4
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Teaching material agriculture food technology
Chapter 3 Spatial Domain Image Processing.pdf
Spectral efficient network and resource selection model in 5G networks
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Unlocking AI with Model Context Protocol (MCP)
“AI and Expert System Decision Support & Business Intelligence Systems”
Digital-Transformation-Roadmap-for-Companies.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Electronic commerce courselecture one. Pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Machine learning based COVID-19 study performance prediction
Per capita expenditure prediction using model stacking based on satellite ima...
Reach Out and Touch Someone: Haptics and Empathic Computing
KodekX | Application Modernization Development
Programs and apps: productivity, graphics, security and other tools
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx

Know your errors