raven.jsãéåæã§ããŒãã§ããããã«ãããã®ã§ãããã¹ã¯ãªããã®ããŒãäžã«ãšã©ãŒããã£ããã£ã§ããããã«ããŸãã ïŒã©ã€ãã©ãªãèªã¿èŸŒãŸãããŸã§ã€ãã³ããå€æ°ã«æ ŒçŽããããšã§ãGoogle Analyticsãã€ãã³ããåŠçããæ¹æ³ã®ãããªãã®ã§ãïŒã
ãããç§ããããŸã§ã«æã£ãŠãããã®ã§ãïŒ https ïŒ
ãããããã®ããã«ãããšãã¬ã€ãŽã³ãéåžžæäŸããæ å ±ãšè©³çŽ°ã®äžéšã倱ãããŸãã ãããšåæ§ã«å®å šãªãšã©ãŒæ å ±ãä¿åããæ¹æ³ã¯ãããŸããïŒ
+1
+1
+1
+1
ããã«ã€ããŠã³ã¡ã³ããããã¹ãŠã®äººâ @karolisdzejaã«ãããœãªã¥ãŒã·ã§ã³ã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
æçµçã«ãRaven.jsãœãŒã¹ãããŒãžã«ãªãå Žåã«æ©èœããã¯ãã®æ©èœãRaven.jsãœãŒã¹ã«è¿œå ããæ¹æ³ãããããŸããã ããã¯åžžã«æçµçã«ã¯ã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ã«ãªããšæããŸãã ãããããããã¥ã¡ã³ãã«ãããŠããŒããè¿œå ããããšãã§ããŸãã
@benvinegarãœãªã¥ãŒã·ã§ã³ã¯åé¡ãªãããã«èŠããŸããããããå ¬åŒã«ãµããŒããããææžåãããŠãããšããã§ãããã ã©ã³ãã ãªèŠç¹ãè©äŸ¡ããããšãããã»ã³ããªãŒããŒã ãä¿¡é Œããå¿ èŠãããã ãã§å¹žãã§ãã
å®éãã¯ããã«åªãããœãªã¥ãŒã·ã§ã³ã¯ãTwitterã®JS SDKã³ãŒãã®ãããªãã®ã§ãïŒ https ïŒ
ããŒãžã®èªã¿èŸŒã¿æã«é¢æ°ãã¥ãŒãèšå®ããŸãããã®ãã¥ãŒã¯ãå€éšjsãèªã¿èŸŒãŸãããšãã«æ¶è²»ããããããã·ãªããžã§ã¯ãã眮ãæããŸãã ãŸãããã¹ãŠã®APIåŒã³åºãããããã·ãžã®.readyïŒïŒåŒã³åºãã®ãããªãã®ãééããããšã確èªããŠãã ããã
ããã«ããããã¹ãŠã®é¢æ°ãåå¥ã«ãããã·ããããšãªããcaptureMessageã ãã§ãªããjsãããŒããããåã«ãã¹ãŠã®åŒã³åºãããã¥ãŒã«å ¥ããããšãã§ããŸãã
raven.jsãéåæ/é 延ã§ããŒãã§ããå¿é ããå¿ èŠããªãããã«ããããšæããŸãã
èŠç¹ã«é¢ãããã®ä»ã®åé¡ïŒwindow.onerrorãèŠãé ããå«ãŸããŠããªãã°ããŒãã«å€æ°ãããã€ãå°å ¥ããŸãã
ãŸããraven.jsãããŒãæã«äœ¿çšãããã«æ©èœã®traceKitWindowOnErroré¢æ°ã䜿çšããŸããã
äžèšã®èŠç¹ãå°ãããçŽããŸããïŒ https ïŒ//gist.github.com/oroce/ec3786ba7eff59963842220c3ffc56b4
ãªãŒã¯å€æ°ã¯ãããŸããã ç§ã¯ä¿ãwindow.onerror
ãã³ãã©ãã䜿çšããŠèªç±ã«æããwindow.addEventListener('error', fn)
ã
ãã®æç¹ã§ã®æ倧ã®å©ãã¯ãRavenãããšã¯ã¹ããŒããããé¢æ°ãšããŠtraceKitWindowOnError
ã䜿çšããããšã§ãã ããã¯ãšã©ãŒãçºçãããšãã«åŒã³åºãããé¢æ°ãªã®ã§ã https ïŒ
éåžžã«é©åãªã¹ã¿ãã¯ãã¬ãŒã¹ããªãããšã¯ããã£ãŠããŸãããçŸåšãããåªãããã®ããããŸãã
ãããè¡ãããšã«ã¯ä»ã«ãæ¬ ç¹ããããŸãã
window.onerror
ã«äŸåããããšã«ãããã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãã¹ãŠã®ãã©ãŠã¶ã§å©çšã§ããããã§ã¯ãããŸããinstall()
ãã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãè©Šè¡/ãã£ããããçç±ã§ããããã£ãŠãããã©ãŒãã³ã¹ãåäžããå¯èœæ§ãããã®ã§ãå質ã®äœããšã©ãŒã¬ããŒããšäº€æããããšã«ãªããŸãã éåæå®è¡ãéèŠãªå Žåã¯ãRavenãç¬èªã®ã³ãŒãã«ãã³ãã«ããŠãäžç·ã«æäŸãããããã«ããããšããå§ãããŸãã
@benvinegarããªãã¯å®å šã«æ£ããã§ãã å ¬éãããŠããªãïŒå¥åãã°ãŒã°ã«ãããŒãžã«å°éããªãïŒã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå€å žçãªïŒãããã¯ããïŒã¬ã€ãŽã³ã®æ¹æ³ã¯å®å šã«åé¡ãããŸããããã°ãŒã°ã«ããŒãžã®æŽå¯ãã€ã³ããéèŠã§ããå ¬éãµã€ããã§ãããããã«æé©åããå¿ èŠããããŸããµãŒãããŒãã£ã®ã³ãŒããããŒãããæ¹æ³ïŒããã¯ãUXãé床ãããã³ããè¯ãæ€çŽ¢çµæã®äœçœ®ãåªå ããŠæ¯æãããšãããšããªãäŸ¡æ Œã§ãïŒã
ããã«ãã¬ã€ãŽã³ããã³ãã«ã«ãã³ãã«ããããšã解決çã§ããã factor-bundleãªã©ã®ããŒã«ã䜿çšããŠãã³ãã«ãè€æ°ã®ãã³ãã«ã«åå²ããããè€æ°ã®ãã³ãã«ãå«ããŠé床ãäžããããããªã©ããã©ãŒã«ããè¶ ããæé©åã§ããã³ããšã³ãã³ãŒããæé©åãããšããã«äžèšã®è§£æ±ºçã¯ããè¯ããã®ã«ãªãå¯èœæ§ããããŸãããç§ã¯ææ¡ãåãä»ããŠããŸãã
ãããã¯ãã¹ãŠãã¬ãŒããªãããããããå©çšå¯èœãªãã¹ãŠã®æŠç¥ãææžåã§ããã°çŽ æŽããããšæããŸããç¹å®ã®Webã¢ããªã±ãŒã·ã§ã³ããšã«å¿ããŠãããŸããŸãªæŠç¥ãé©çšããŸãã
éåææŠç¥ã§ã¯ã onload
ã€ãã³ãã®ãããã¯ãã¬ã³ããªã³ã°ãé²ãããã«ãéåæã®ã¿ãããŒãããã®ã§ã¯ãªãã onload
ã€ãã³ãã®åŸã«ã¹ã¯ãªãããããŒãããå¿
èŠããããŸãã
/**
* Setup Js error lazy tracking
* - Pros: doesn't block rendering, onload event
* - Cons: lower quality error reports for lazy errors
*
* <strong i="9">@author</strong> vinhlh
*
* <strong i="10">@param</strong> {object} window
* <strong i="11">@param</strong> {object} labJs
* <strong i="12">@param</strong> {string} ravenCdn
* <strong i="13">@param</strong> {string} sentryDsn
*/
(function(window, labJs, ravenCdn, sentryDsn) {
var errors = [];
var oldOnError = window.onerror;
window.onerror = function() {
errors.push(arguments);
oldOnError && oldOnError.apply(this, arguments);
};
window.addEventListener('load', function() {
labJs
.script(ravenCdn)
.wait(function() {
window.onerror = oldOnError;
Raven.config(sentryDsn).install();
errors.forEach(function(args) {
window.onerror.apply(this, args);
});
});
});
})(window, $LAB, 'raven-js-3.8.1/dist/raven.js', 'https://[email protected]/9');
ãããããäžèšã®ãããªéåæã¹ãããããææžåããã ãã ãšæããŸããããã¬ãŒããªãã䌎ãããšã«èšåããŠãã ããã
ãã1ã€ã³ã¡ã³ãã ãããã®ãã¬ãŒããªãã¯èš±å®¹ã§ããããã«æããããããããŸããããRaven.jsã«ç±æ¥ãããšïŒèª€ã£ãŠïŒä¿¡ããããŠããããŠãŒã¶ãŒãçµéšããŠããå¿ å®åºŠã®äœããšã©ãŒã«é¢ããå€ãã®ãµããŒããã±ãããæ±ã£ãŠããŸãã ç§ã®æãã¯ãéåæã¢ãããŒãã䜿çšããããã«äººã ã«å§ãããšããã®ã¢ãããŒãã®å¿ å®åºŠãäœãããã«ããã¹ã¿ãã¯ãã¬ãŒã¹ããªãã®ã¯ãªãã§ããããªã©ã®äžæºãå°ãã人ãå¢ããããšã§ãã ç§ã¯ãããåãã§åãå ¥ããŸããã飲ã¿èŸŒãã®ã¯é£ããè¬ã§ãã ð
@benvinegarç§ã¯ããªããã©ãããæ¥ãŠããã®ããå®å šã«
@oroce âã¯ããããã¯ãã®ã¹ã¬ããã®äººã ã«ã¯100ïŒ é¢ä¿ãããŸããããèŠåãé©åã«ç解ããã«ãã®æŠç¥ãè¿œæ±ããå¯èœæ§ã®ãã人ã ïŒããšãã°ãã³ããŒ/貌ãä»ãïŒã
Install
ããã¥ã¡ã³ãã«ã¹ãããããè¿œå ããèšç»ãç«ãŠãŠããã®åé¡ãæªè§£æ±ºã®ãŸãŸã«ããŠãããŸãããããŠããã¡ãã¡ã«ããããã®èŠåã衚瀺ããŸãã
ããã«ãåå ããã ãããããšãããããŸã/ãããè¡ãããã«ç§ã説åŸããŸãã
Ravenã¡ãœãããžã®åŒã³åºããééçã«ãã¥ãŒã«å ¥ããããã«äœ¿çšããã¹ããããã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ã¢ãã¯ã¯ç¢ºãã«æ¹åãããå¯èœæ§ããããŸãããããå€ãã®æ©èœãè€è£œããå¿
èŠã¯ãããŸããã Object.defineProperty
䜿çšãããšã Raven
ããŠã£ã³ããŠã«ã¢ã¿ãããããçŽåŸã«ããã¯ã§ããŸãããã¹ã¯ãªããã®ããŒãã€ãã³ãã§ååãªå ŽåããããŸãã ãããå¯èœã«ããå
¬åŒã®æ¹æ³ããããšããã§ãããã
ããã¿ããªãã¬ã€ã¬ã³ãéåæã§ãããè¡ãæ¹æ³ã«äœãåé¡ãããã®ã ãããïŒ
ããããããŸãããããšããžã±ãŒã¹ãããŸãåŠçã§ããããã§ããïŒ ç§ã¯ééã£ãŠãããããããŸãã:)
@ Kl0tlãšãŠãçŽ æµã§ããããããšã
ããã¯ãåçã€ã³ããŒãã䜿çšãããšéåžžã«ç°¡åã§ãã ãŸã stage3ã«ãããŸãããwebpackã§ãµããŒããããŠããŸãã
åã«promiseããã¥ãŒãšããŠäœ¿çšããŸãã ãã«ãã¡ã€ã«ã«ãªããšããã¹ãŠã®ã³ãŒã«ããã¯ãé çªã«å®è¡ãããŸãã
const RavenPromise = import('raven-js'); // async load raven bundle
// initial setup
RavenPromise.then(Raven => {
Raven.config('url-to-sentry', options).install();
}):
// exported log function
export const logMessage = (level, logger, text) => {
RavenPromise.then(Raven => {
Raven.captureMessage(text, {level, logger});
});
};
åæ§ã«@zanonaã«ç§ã¯ãŸããRaygunã¯ãŸãã¯ã®ãããªã·ã³ãã«ãªãã©ããã³ã°ã³ãŒããæã£ãŠããããšã奜ãã ããGoogle AnalyticsããããŸãã analytics.jsã®äŸã次ã«ç€ºããŸãã
<script async src="https://www.google-analytics.com/analytics.js"></script>
<script>
window.ga = window.ga || function () {
(ga.q = ga.q || []).push(arguments)
}
ga.l = +new Date
ga('create', 'UA-XXXXX-Y', 'auto')
ga('send', 'pageview')
</script>
@benvinegar Raven.jsã§ãã®ãããªããšãå¯èœã§ããïŒ å€åå°æ¥ïŒ
@kireerikããã¯ééããªãå®è£ ãããŸãïŒããããããã¥ã¡ã³ãã®ããŠããŒãšããŠïŒããæ£ç¢ºãªæ¥ä»ã®èŠç©ãããä»ã¯æäŸã§ããŸããã
@kamilogorekããã§ããïŒè§£æ±ºçãšããŠã®åé¿çã¯å¥œãã§ã¯ãããŸããïŒã åé¡ãªãïŒ
èå³ã®ãã人ã®ããã«ãç§ã¯ravenjsãéåæçã«ããŒãããããã«å¥ã®æ¹æ³ã®èŠç¹ãè¿°ã¹ãŸããã
https://gist.github.com/MaxMilton/e2338b02b7381fc7bef2ccd96f434201
ããã¯@oroceã«ããã³ãŒãã«åºã¥ããŠã<script async src'='...">
ã¿ã°ã䜿çšããããšã§ãïŒãã©ãŠã¶ãŒã¯ãªãœãŒã¹ã®ãã§ãããããæ©ãã¹ã±ãžã¥ãŒã«ã§ããŸãïŒ+ããããã©ããããå¿
èŠã¯ãããŸããIIFEããã³ãã®ä»ã®å°ããªèª¿æŽã
@MaxMiltonãããïŒ ç§ã¯ããªãã®ãã¬ãŒããŒã«åºã¥ããŠç¬èªã®ãã¬ãŒããŒãäœæããŸããïŒ
<script async src="https://cdn.ravenjs.com/3.22.1/raven.min.js" crossorigin="anonymous" id="raven"></script>
<script>
(function (sentryDataSourceName) {
var raven = document.getElementById('raven')
, isNotLoaded = true
, errors = []
raven.onreadystatechange = raven.onload = function () {
if (isNotLoaded) {
Raven.config(sentryDataSourceName).install()
isNotLoaded = !isNotLoaded
errors.forEach(function (error) {
Raven.captureException(error[4] || new Error(error[0]), {
extra: {
file: error[1]
, line: error[2]
, col: error[3]
}
})
})
}
}
window.onerror = function (message, source, lineNumber, colmnNumber, error) {
if (isNotLoaded)
errors.push([message, source, lineNumber, colmnNumber, error])
}
})('https://<key>@sentry.io/<project>')
</script>
ç§ãããã€ã質åããããŸãïŒ
script
ã¿ã°ã«crossorigin
å±æ§ãå®çŸ©ããå¿
èŠããããŸããïŒã©ãæããŸããïŒ ããã«ã€ããŠã®äœè ïŒ@kamilogorekïŒã®æèŠã¯äœã§ããïŒ
@kireerikã¹ã¯ãªããã«crossorigin="anonymous"
ã眮ããšã window.onerror
ã€ãã³ãã§ïŒãã®å€éšã¹ã¯ãªããããïŒãšã©ãŒãå®å
šã«ãã£ããã£ã§ããŸãã ãŸãããã©ãŠã¶ããã§ããèŠæ±ã§ã¯ã¬ãã³ã·ã£ã«ãéä¿¡ããã®ãé²ããŸããããã¯éåžžããµãŒãããŒãã£ã®ãªãœãŒã¹ã§å¿
èŠãªãã®ã§ãã MDNãªãã¡ã¬ã³ã¹1 ã MDNãªãã¡ã¬ã³ã¹2 ã
ãšã©ãŒãæž¡ãã ãã§ãã»ãšãã©ã®å Žåæ©èœããŸãã å€ããã©ãŠã¶ïŒããŒãžã§ã³31ããåã®Firefoxãªã©ïŒã§ããå Žåã®æ³šæç¹ã¯ãcolumnNoãŸãã¯ErrorObjectããããã£ãwindow.onerror
ã€ãã³ãã«æž¡ããªãããšã§ãã ãããã£ãŠãæ¬åœã«åªããäºææ§ãå¿
èŠãªå Žåã¯ããã®äœåãªããããå®è¡ããå¿
èŠããããŸãã MDNãªãã¡ã¬ã³ã¹ã
ç·šéïŒããŒãã¹ã®ãã³ãïŒ crossorigin
ãå€ãªãã§å
¥åãããšã crossorigin="anonymous"
ãšåãããã«æ±ãããŸãã
åèãŸã§ã«ã以åã®èŠç¹ããããæ¬çªç°å¢ã«å¯Ÿå¿ãããã®ã«æŽæ°ããŸããã
ãã¹ãŠãç解ãããå ŽåããŸãã¯ã¯ã€ãã¯ã³ããŒã¢ã³ãããŒã¹ãã奜ãå Žåã¯ãèŠç¹ãåç §ããŠãã ãããçž®å°çã¯æ¬¡ã®ãšããã§ãã
<!-- Sentry JS error tracking -->
<script async src="https://cdn.ravenjs.com/3.22.0/raven.min.js" crossorigin id="raven"></script>
<script>
(function(b,e,c,d){b.onerror=function(a,b,d,f,g){c||e.push([a,b,d,f,g])};b.onunhandledrejection=function(a){c||e.push([a.reason.reason||a.reason.message,a.type,JSON.stringify(a.reason)])};d.onreadystatechange=d.onload=function(){c||(c=!0,
Raven.config("___PUBLIC_DSN___").install(),
b.onunhandledrejection=function(a){Raven.captureException(Error(a.reason.reason||a.reason.message),{extra:{type:a.type,reason:JSON.stringify(a.reason)}})},e.forEach(function(a){Raven.captureException(a[4]||Error(a[0]),{extra:{file:a[1],line:a[2],col:a[3]}})}))}})(window,[],!1,document.getElementById("raven"));
</script>
<link rel="preconnect" href="https://sentry.io">
___PUBLIC_DSN___
ãDSNã«çœ®ãæãããããé ã®æåŸã®</head>
ã¿ã°ã®è¿ãã«è²Œãä»ããŸãã ãŸãã¯ã <head>
<body>
ã¿ã°ãšã«ãä»ã®JavaScriptã®
ç§ã®ã¯ã€ãã¯ãã¹ãã§ã¯åé¡ã¯ãªãã£ãã®ã§ãããã©ã«ãã®åæããŒãžã§ã³ã§ããã䜿çšããªãçç±ã¯ããããŸããã
誰ããããè¯ãã¢ãããŒãã®ã¢ã€ãã¢ãæã£ãŠãããªããç§ã¯ãããèããããšæã£ãŠããŸãã
ç·šéïŒãã®ã³ã¡ã³ããäœåºŠãç·šéããŠãã¿ãŸããã çŸåšã¯å®å®ããŠããŸãã ãã®ç¶æ ã«ããã®ã¯æ¥œããã£ãã§ãïŒ ïŒã¹ãã€ãªãŒïŒ
æ©åšã©ã€ãã©ãªãããŒãããããšããšã©ãŒå ±åã®å質ã¯åæã®ããŒããšãŸã£ããåãã«ãªããŸããïŒ ïŒç§ã¯ããæããŸãããã ãã§ãã¯ããã ãã§ãïŒ
ãŸããè¿œå ãããããã¥ã¡ã³ãã§ã¯ãlibãããŒãããããŸã§Ravenã䜿çšã§ããŸããããªãã·ã§ã³ã§ã³ãŒã«ããã¯é¢æ°ãæäŸããŠããŠãŒã¶ãŒã³ã³ããã¹ããªã©ãèšå®ã§ããŸããïŒ
@ dalyr95ã«åæããŸãã ã³ãŒã«ããã¯é¢æ°ã䟿å©ã§ãã å€åã«ã¹ã¿ã ã¬ã€ãŽã³ããŒãã€ãã³ãã
@ dalyr95ãšåæ§ã®ãªã¯ãšã¹ãããããŸãã çŸåšã setUserContext()
ãåŒã³åºãå¯äžã®æ¹æ³ã¯ãã¡ã€ã³ã®æ§æãªããžã§ã¯ãã§ã³ãŒã«ããã¯ãæž¡ãããšãã§ããã»ã©ã¯ãªãŒã³ã§ã¯ãªãããŒããŒã¹ãããããå€æŽããããšã§ãã
ããã«ã¡ã¯ãåé¡ãå ±åããŠããã ãããããšãããããŸãã
SDKã®æ¬¡ã®ã¡ãžã£ãŒãªãªãŒã¹ã«åãçµãã§ããŸãã
ãã®ãããçŸåšã®ããŒãžã§ã³ïŒã¡ãžã£ãŒãã°ãŸãã¯ã»ãã¥ãªãã£ãã°ãé€ãïŒã§ã®äœæ¥ãä¿çã«ããå¿
èŠããããŸããã
ã§ããã ãæ©ããã¹ãŠã®ã¬ããŒãã«æ»ãããã«åªããŸãã®ã§ããã°ãããåŸ
ã¡ãã ããã
ããã£ãŠãããŠããããšãã
也æ¯ïŒ
ç§ã®è§£æ±ºçã¯ã 'undefined'!=k.setup&&k.setup();
ã®åŒã³åºãã®çŽåŸã«.install()
ã次ã«ãpost initã³ãŒãã䜿çšããŠsetup
ãšããé¢æ°ãSENTRY_SDK
ã«è¿œå ããŸããã
éåæããŒããŒã䜿çšãããšã2çªç®ã®åŒæ°ãšããŠRaven.config
æž¡ãããšã§ããŠãŒã¶ãŒã³ã³ããã¹ãããã®ä»ã®æ
å ±ãèšå®ã§ããŸããã
<script>
Raven.config("https://<mydsn>@sentry.io/<projectid>",
{"release":"0.3.1",
"environment":"dev",
"user": {"id":"7b031fa0-32ff-46fe-b94b-e6bc201c3c5f",
"organisation-id":"b1a50c41-b85e-4c50-9cec-c55ff36cf6d1"}}).install();
</script>
ç§ã¯ããã®ããã«ãã¹ãŠããã§ã«ååšããŠãããšæããŸããããã¯ãã ããããææžåããããããããŸããã
@danielcomptonã¯ãããã¯ãšã³ãAPIãä»ããŠã®ã¿ãŠãŒã¶ãŒæ å ±ãååŸã§ããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
Ravenã¡ãœãããžã®åŒã³åºããééçã«ãã¥ãŒã«å ¥ããããã«äœ¿çšããã¹ããããã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ã¢ãã¯ã¯ç¢ºãã«æ¹åãããå¯èœæ§ããããŸãããããå€ãã®æ©èœãè€è£œããå¿ èŠã¯ãããŸããã
Object.defineProperty
䜿çšãããšãRaven
ããŠã£ã³ããŠã«ã¢ã¿ãããããçŽåŸã«ããã¯ã§ããŸãããã¹ã¯ãªããã®ããŒãã€ãã³ãã§ååãªå ŽåããããŸãã ãããå¯èœã«ããå ¬åŒã®æ¹æ³ããããšããã§ãããã