@sentry/browser
@sentry/node
4.3.4
æ©åšãããnext.jsãããžã§ã¯ãã«çµ±åããŠã¿ãŸããã ãã®ãã³ãã¬ãŒãhttps://github.com/sheerun/next.js/tree/with-sentry-fix/examples/with-sentryã䜿çšããŠè©ŠããŠã¿ããšãããæ©åšã®ã¡ã¢ãªãªãŒã¯ãšæããããã®ãèŠã€ãããŸããã ãã®ãããžã§ã¯ãããã§ãã¯ã¢ãŠãããŠmemwatchãè¿œå ããå Žå
if (!dev) {
memwatch.on("leak", info => {
console.log("memwatch::leak");
console.error(info);
});
memwatch.on("stats", stats => {
console.log("memwatch::stats");
console.error(Util.inspect(stats, true, null));
});
}
ãªã¯ãšã¹ãã§ãµãŒããŒãæ»æãã次ã®ãªãœãŒã¹ããªã¯ãšã¹ãããŸããã
"/",
"/_next/static/r1zovjaZ1TujaA0hJEp91/pages/_app.js",
"/_next/static/r1zovjaZ1TujaA0hJEp91/pages/_error.js",
"/_next/static/r1zovjaZ1TujaA0hJEp91/pages/index.js",
"/_next/static/runtime/main-1eaa6d1d0c8e7d048efd.js",
"/_next/static/chunks/commons.b34d260fee0c4a698139.js",
"/_next/static/runtime/webpack-42652fa8b82c329c0559.js"
ããã«ãããã¡ã¢ãªäœ¿çšéã¯ç§ã«ãšã£ãŠééãªãå¢ããŸãã server.jsããrequestãšerrorHandlerãåé€ãããšããã«ãã¡ã¢ãªãªãŒã¯ãåæ¢ããŸãã ã ããããã2ã«æ¥ç¶ãããŠããããã§ã
@abraxxasãã®åé¡ã®åçŸãæäŒã£ãŠããããŸããïŒ ãã®ã¡ã¢ãªãªãŒã¯ãã©ã®çšåºŠæ£ç¢ºã«ããªã¬ãŒããŠããŸããïŒ
ç§ã¯éãæªãã£ãã®ã§ããªãã®èª¬æãè©ŠããŸãããããã¯ãã çµ±èšã€ãã³ããçæããŸãã決ããŠãããæŒãããŸããã
@kamilogorekãåçããããšãããããŸãã ç§ãããããšã¯æ¬¡ã®ãšããã§ããã ãã®äŸhttps://github.com/sheerun/next.js/tree/with-sentry-fix/examples/with-sentryããã§ãã¯ã¢ãŠãããserver.jsã«memwatchãè¿œå ããŸãã
if (!dev) {
memwatch.on("leak", info => {
console.log("memwatch::leak");
console.error(info);
});
memwatch.on("stats", stats => {
console.log("memwatch::stats");
console.error(Util.inspect(stats, true, null));
});
}
次ã«ãããŒã10.xã䜿çšããŠäŸãå®è¡ãïŒ8.xiã§ã¯ã¡ã¢ãªã®åé¡ã¯èŠ³å¯ãããŸããã§ããïŒãã¬ããªã³ã°ãã¹ãã¹ã€ãŒãã䜿çšããŠæ¬¡ã®ãªãœãŒã¹ãèŠæ±ããŸããã
"/",
"/_next/static/r1zovjaZ1TujaA0hJEp91/pages/_app.js",
"/_next/static/r1zovjaZ1TujaA0hJEp91/pages/_error.js",
"/_next/static/r1zovjaZ1TujaA0hJEp91/pages/index.js",
"/_next/static/runtime/main-1eaa6d1d0c8e7d048efd.js",
"/_next/static/chunks/commons.b34d260fee0c4a698139.js",
"/_next/static/runtime/webpack-42652fa8b82c329c0559.js"
ïŒããã·ã¥ãå€æŽãããå¯èœæ§ãããããšã«æ³šæããŠãã ããïŒ
ãããããã®ã¢ãããŒãã§åãçµæãéåžžã«ç°¡åã«éæã§ããã¯ãã§ãhttps://www.simonholywell.com/post/2015/06/parallel-benchmark-many-urls-with-apachebench/
æ°ååã®ãªã¯ãšã¹ãã®åŸãã¡ã¢ãªäœ¿çšéã¯ã»ãŒ1GBã«ãªããã¢ã€ããªã³ã°æã§ãæžå°ããããšã¯ãããŸããã§ããã server.jsããrequestãšerrorHandlerãåé€ãããšããã«ãã¡ã¢ãªãªãŒã¯ãåæ¢ããŸãã ãããã£ãŠããããã®2ã«æ¥ç¶ãããŠããããã§ãããªã¯ãšã¹ããå°ãªãããããããŒã8.xã䜿çšããå¯èœæ§ããããŸããïŒ
@abraxxasã確èªãããŸããã ããŒã10+åãªãœãŒã¹ã®ã300reqããžã§ããå®è¡ããŸãã ããã«èª¿æ»ããŸãã ããããšãïŒ
@kamilogorekèå³æ·±ãã§ãããããªããããªãã®
åçŸãããšããã³ãã©ãŒãªãã§çŽ20MBã«çãŸãããšãããããŸã
ããããããããšãšãã«æ¥éã«å¢å ããŸãã
ãã³ãã©ãŒãªãã®ã¡ã¢ãªãªãŒã¯èŠåã¯ã次ã®çç±ã ãã§çºçãããšæããŸã
ãªã¯ãšã¹ãã«ãããäžå®ã®ã¡ã¢ãªå¢å ããããŸãã
ãšã®ããŒãžã§ã³éã§ã¡ã¢ãªäœ¿çšéã«ãŸã 倧ããªéãããããŸã
æ©åšãšãªãã
2018幎11æ29æ¥æšææ¥ã12ïŒ45KamilOgórek< [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@abraxxas https://github.com/abraxxasæ£åžžã«åçŸããŸãããã
ãã ãããµãŒããŒã¯ããèªäœã§ãªã¯ãšã¹ããªããžã§ã¯ãããªãŒã¯ããŠããããã§ãã
ã»ã³ããªãŒãã³ãã©ãŒããªããŠãããã¡ã€ã³ãšç¬èªã®ã¹ã³ãŒããã¢ã¿ãããããããæé·çã¯å°ã倧ãããªããŸã
ãªã¯ãšã¹ãã«å察ããŸãããGCã«ãããªã¯ãšã¹ããšäžç·ã«å©çšãããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/getsentry/sentry-javascript/issues/1762#issuecomment-442804709 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AIbrNlgPjPd5Jra1aahR-Dthf7XvbCexks5uz8jjgaJpZM4YvOA2
ã
@abraxxasã¯ç§ã®åã®ã³ã¡ã³ãïŒç§ãåé€ãããã®ïŒãç¡èŠããŸããããã¯å®å
šã«ç§ãã¡ã®åŽã«ãããŸã:)
ããã¯ãããŒãã®ã³ã¢èªäœã®åé¡ã®ããã§ãã ãã®ã³ã¡ã³ããåç §ããŠãã ããhttps://github.com/getsentry/sentry-javascript/issues/1762#issuecomment-444126990
@kamilogorekããã調ã¹ãæ©äŒã¯
æ€æ»å®ã¯eventProcessors
ãªã¹ãã«äœåãã®ãšã³ããªã瀺ããŸãã
ç©äºãã©ã®ããã«èšèšãããŠãããã«ã€ããŠã®ã³ã³ããã¹ãã¯ãããŸãããããªã¯ãšã¹ãã®ã¹ã³ãŒããæ£ãããªããééã£ãã¡ã¿ããŒã¿ãæäŸãããŠããããšã«æ°ä»ããŸããïŒïŒ1773ãåç §ïŒããã®ããããã¹ãŠãã°ããŒãã«ç¶æ ã§ç®¡çãããŠããããªã¯ãšã¹ãã¯çµäºããŸã
@ abraxxas @ tpbowdenããŒãã®ã³ã¢èªäœã®ãã¡ã€ã³ã¢ãžã¥ãŒã«ã®ãªãŒã¯ã«åé¡ããããŸãã ãããç£èŠãç¶ããã³ã¢ã§ä¿®æ£ãããåã«äžæçãªè§£æ±ºçãèãåºãããã«ããŸãã é¢é£ããåé¡ïŒ https ïŒ
@kamilogorekããã«å¯Ÿããåé¿çãŸãã¯äžæçãªä¿®æ£ã«ã€ããŠäœãã¢ã€ãã¢ã¯ãããŸããïŒ ããŒãã®åé¡ã®é²è¡ã¯éåžžã«é ãããã§ã
çŸåšãã¡ã¢ãªãç¹å®ã®ãããå€ã«éãããšãã«Node.jsããã»ã¹ãåèµ·åããããã«PM2ã䜿çšããŠããŸãã https://pm2.io/doc/en/runtime/features/memory-limit/#max -memory-threshold-auto-reload
ãŠããããã¹ãã«ã©ãã䜿çšããã æŒãã¯ãŸã ååšããŠããŸãã ãªãŒã¯ã¯ãããã°ãé£ããå Žåãããããšãç§ã¯ç¥ã£ãŠããŸãã ä¿®æ£ã®ããã®ETAã¯ãããŸããïŒ
1ã€ã®ãã¹ããå®äºããŸãã
ãã¹ãæéïŒ1832ããªç§
次ã®ãªãŒã¯ãæ€åºãããŸãããnpm ERRïŒ ã³ãŒãELIFECYCLE
npm ERRïŒ errno 1
npm ERRïŒ [email protected]ãã¹ãïŒlab build/test
npm ERRïŒ çµäºã¹ããŒã¿ã¹1
npm ERRïŒ
npm ERRïŒ [email protected]ãã¹ãã¹ã¯ãªããã§å€±æããŸããã
npm ERRïŒ ããã¯ããããnpmã®åé¡ã§ã¯ãããŸããã äžèšã®è¿œå ã®ãã°åºåãããå¯èœæ§ããããŸããnpm ERRïŒ ãã®å®è¡ã®å®å šãªãã°ã¯ã次ã®å Žæã«ãããŸãã
npm ERRïŒ /Users/sunknudsen/.npm/_logs/2019-02-13T14_41_28_595Z-debug.log
@sunknudsenãã®åé¡ã¯å®éã«ã¯NodeJSã§ä¿®æ£ãããŠããŸããhttpsïŒ//github.com/nodejs/node/issues/23862ããã³https://github.com/nodejs/node/pull/25993ãåç §ããŠ
@garthenwebããã±ãŒãžã®éçºæ¹æ³ãåå ã§ãããã¯@sentry/node
圱é¿ããŸããïŒ ç§ãhapiã§éçºããŠããïŒãããŠä»ã®å€ãã®äŸåé¢ä¿ã«äŸåããŠããïŒãããžã§ã¯ãã®1ã€ã¯ããªãŒã¯ãçæããŸããïŒå°ãªããšããã©ãã§ã¯æ€åºãããŸããïŒã
@sunknudsenå€ããå°ãªããã ç§ãç解ããŠããéããããã¯ïŒéæšå¥šã®ïŒãã¡ã€ã³ããã±ãŒãžãšpromiseã®çµã¿åããã§ãã https://github.com/getsentry/sentry-javascript/blob/master/packages/node/src/handlers.ts#L233ãåç §ããŠ
ç§ã®å Žåãæ©åšããã«ãŠã§ã¢ãïŒãšã¯ã¹ãã¬ã¹ïŒãµãŒããŒããåé€ããŠä¿®æ£ããŸããã
ããã¯ããŒãã§ã¯åé¡ã§ã¯ãããŸããããSentryãã³ãã©ãŒãç¡å¹ã«ãããšåé¡ãä¿®æ£ããããããSentryã§ã¯åé¡ã«ãªããŸãã
@MartijnHolsçŸåšãSDKã®ã¡ã¢ãªãããããªã³ããå€§å¹ ã«åæžããã¡ãžã£ãŒãªãªãŒã¹ã«åãçµãã§ããŸãã åéºå¿ãããã°ã httpsïŒ//github.com/getsentry/sentry-javascript/pull/1919ãè©ŠããŠã¿ãŠ
@HazATãããã§ãæšå€ïŒã°ã©ãã®23:10ã«ïŒæ¬çª
@MartijnHolsè©ŠããŠããã ãããããšãããããŸãïŒ
èŠããŠããã¹ã2ã€ã®ããšã¯ãããŒãå
ã®ãã¡ã€ã³ã®ã¡ã¢ãªãªãŒã¯ä¿®æ£ããããŒãã«æè¿11.10
çéžããããšã§ãã
ãŸãã latest
ã¿ã°ã誀ã£ãŠä»ããããããã 5.0.0-beta1
ãéå
¬éã«ããå¿
èŠããããŸããã 5.0.0-rc.1
ãææ°ã®next
ããŒãžã§ã³ã«ãªããŸããã
5.0.0-rc.1
ãè©ŠããŠã¿ãŠãã ãããã€ãã³ãã®ãã¥ãŒã«å
¥ããæ¹æ³ãå°ãå€æŽããŸãããããã«ãããè² è·/ã¡ã¢ãªã倧å¹
ã«æ¹åãããŸãã
ããŒã11.12ã«æŽæ°ãããšãã¡ã¢ãªãšCPUã®äœ¿çšéãå®å®ããããã§ãã ãã³ãã©ãŒãç¡å¹ã«ããå Žåãšæ¯èŒããå ŽåããªãœãŒã¹ã®äœ¿çšéã«èªèã§ããéãã¯ãªãããã§ããããããå°ãã ãè¯ãã§ãããã ãŸããå¿ èŠãªãã¹ãŠã®æ å ±ã§ãšã©ãŒãããŸããã£ããããŠããããã§ãïŒã³ã³ãœãŒã«ã®ããã¬ããã¯ã©ã ãããã£ãšãããããããŸããã 5.0.0ã«ã€ããŠä»ã«äœã確èªã§ãããããããŸããã åé¡ãçºçããå Žåã¯ãç¥ããããŸãããããããããã§ã¯ãããŸããã
LGTMã ããããšãïŒ
ãããè©ŠããŠã¿ãŠãã ããã @HazAT 11.10
ã®ä¿®æ£ãã¢ã¯ãã£ããªLTSãªãªãŒã¹10.x
ãã§ã«ããã¯ããŒããããŠãããã©ããç¥ã£ãŠããŸããïŒ
@adriaanmeuris誰ãã10.x
ã«ããã¯ããŒããããã©ããå°ããã®ãèªã¿ãŸãããããããããã©ããã¯ããããŸããã
åç
§ïŒ https ïŒ
ãšã¯ã¹ãã¬ã¹ããã«ãŠã§ã¢ã§ã¯ã©ã€ã¢ã³ããšã¹ã³ãŒããæåã§äœæããåé¡ã解決ããŸãã
é¢æ°ããšã¯ã¹ããŒããããã¡ã€ã«services/sentry
ãäœæããŸãã
import {
NodeClient as SentryClient, Hub, Integrations, Scope,
} from '@sentry/node';
import config from 'config';
const sentryClient = new SentryClient({
...config.sentry,
frameContextLines: 0,
integrations: [new Integrations.RewriteFrames()],
});
export default () => {
const scope = new Scope();
const client = new Hub(sentryClient, scope);
return Object.freeze({ client, scope });
};
ããã«ãŠã§ã¢ã§ã¯ãæ©åšã¯ã©ã€ã¢ã³ã/ã¹ã³ãŒãã次ã®ããã«ãªã¯ãšã¹ããªããžã§ã¯ãã«ä¿åããŸã
app.use((req, res, next) => {
req.sentry = getSentry();
req.sentry.scope.setTag('requestId', req.requestId);
req.sentry.scope.setExtra('More info', 'XXXXXX');
next();
});
....
// and use the express error handler
app.use((err, req, res, next) => {
const code = err.code || 500;
res.status(code).json({
code,
error: err.message,
});
if (code >= 500) {
req.sentry.client.captureException(err);
}
next();
});
ããã§ã¡ã¢ãªãªãŒã¯ãä¿®æ£ãããããã§ã
@coudsãã®å®è£ ã¯æ¬åœã«çŽ æŽãããã§ããããªããèæ ®ããªããã°ãªããªãããšã1ã€ãããŸãã
ãªã¯ãšã¹ãããšã«æ°ããã¯ã©ã€ã¢ã³ããååŸãããã°ããŒãã«ãšã©ãŒ/èªåãã¬ããã¯ã©ã ïŒãŸãã¯ããã©ã«ãã®çµ±åãè¡ããã®ä»ã®æ©èœïŒã¯æ€åºãããŸããã
@HazATããããšããç§ã¯ãããç¥ã£ãŠããŸãããæ¯æãã¹ãå°ããªäŸ¡æ Œã§ãã ãã®å·šå€§ãªã¡ã¢ãªãªãŒã¯ã解決ããããã«ãããããã®æ倱ãæå°éã«æããããã«ãç§ã¯ããã€ãã®ããšãããŸããã
@sentry/webpack-plugin
䜿çšããŠãœãŒã¹ããããæ©åšã«ã¢ããããŒãããŸããã1ã€ããã©ã³ã¶ã¯ã·ã§ã³ã§ããè¿œå ããã¿ã°ããã1ã€è²Œãä»ããã®ãå¿ããŸããïŒããã©ã«ãã®ãã³ãã©ãŒãã·ãã¥ã¬ãŒãããããïŒ
req.sentry.scope.setTag('transaction', `${req.method}|${req.route ? req.route.path : req.path}`);
ããã誰ãã®å©ãã«ãªãããšãé¡ã£ãŠããŸããSentryã¯æ¬åœã«çŽ æŽãããããŒã«ã§ãããã¹ã¿ãã¯ããåé€ãããªãããã«ã§ããéãã®ããšãããŸããã
@HazAT @kamilogorek [email protected]
ãš[email protected]
ãŸã ã¡ã¢ãªã倧å¹
ã«å¢å ããŠããŸã-ãã®nodejsãããã§ä¿®æ£ããããšç¢ºä¿¡ããŠããŸããïŒ
@tpbowdenåçŸãæäŸããããå°ãªããšãã³ãŒããã©ã®ããã«èŠããããæããŠãã ããã
ãŸããSentryã«é¢é£ããä»ã®ãã©ã°ã€ã³ã䜿çšããŠããŸããïŒ
@HazATåçŸããããšããŸããããå€ãã®ããã«ãŠã§ã¢ãåããããªãè€éãªãµãŒããŒãåå ã§ãïŒãµãŒããŒåŽã®ã¬ã³ããªã³ã°ReactïŒã Sentryããã«ãŠã§ã¢ãã€ã³ã¹ããŒã«ãããšãã¡ã¢ãªã倧å¹
ã«å¢å ããŸãïŒé«è² è·ã®å Žåãæ倧10MB /ç§å¢å ããå¯èœæ§ããããŸãïŒã ãµãŒããŒããSentry.Handlers.requestHandler()
ããã«ãŠã§ã¢ãåé€ãããšãã¡ã¢ãªã¯çŽ200MBã§äžå®ã«ãªããŸã
ãã©ã°ã€ã³ã¯äœ¿çšããŠãããã @sentry/node
ã®ã¿ã䜿çšããŠããŸãã ãããåçŸããããã«ç§ãã§ããããšã¯äœãèããããŸããïŒ
@HazATãµãŒããŒäžã§webpackã䜿çšããŠSentryããã³ãã«ããããšã«é¢é£ããŠããããã§ã-ã¢ããªãWebpackã«ãã£ãŠãã«ããããŠããå Žåã«ã®ã¿çºçããŸãã @sentry/node
ãexternals
è¿œå ãããšãã¡ã¢ãªã®åé¡ãä¿®æ£ãããŸããã ãªããããèµ·ããã®ãèãã¯ãããŸããïŒ
ãªãŒã¯ã¯ã@ sentry / node5.1.0ã䜿çšããŠããŒã11.14.0ã§åŒãç¶ãåçŸå¯èœã§ãã
ç§ãã¡ã«ãšã£ãŠããªãŒã¯ã¯@ sentry / nodeãši18next-express-middlewareã®éã®çžäºäœçšã«ãã£ãŠåŒãèµ·ããããŸãã Expressã¢ããªã¯https://github.com/i18next/react-i18next/blob/master/example/razzle-ssr/src/server.jsã«äŒŒãŠã
.use(Sentry.Handlers.requestHandler());
.use(i18nextMiddleware.handle(i18n))
äžã«çœ®ããšãã¡ã¢ãªãªãŒã¯ãçºçããŸãã ãã®äžã«æ©åšã眮ããŠããæŒãã¯ãããŸããã
åãåé¡ããããŸãã node 10.15.3
ãš11.14.0
è©ŠããŠã¿ãŸããã ããã¯ãåé¡ãåçŸããããã®æå°éã®ãªããžããªã§ãhttps://github.com/michalkvasnicak/sentry-memory-leak-reproductionã yarn test
ãŸãã¯yarn test:watch
ãå®è¡ããã ãã§ãããŒãã®äœ¿çšç¶æ³ãå ±åãããŸãã åžžã«å¢å ããŸãã
yarn test
yarn test:watch
@michalkvasnicakäŸãäœæããããã«æéã
SDKã«é¢ããŠå®éã«ã¯äœããã¹ãããŠããŸãã
const Sentry = require('@sentry/node');
it('works', () => {
expect(true).toBe(true);
});
ããã±ãŒãžãå¿
èŠã§ãããããã ãã§ãã
jest
ã§ãªãŒã¯ãã¹ããå®è¡ããçµéšããªãã®ã§ããããŸããããããã±ãŒãžãèŠæ±ããã ãã§äœããªãŒã¯ããå¯èœæ§ããããŸããïŒ
確ãã§ã¯ãããŸããããäœãã足ããªããããããŸããããæ°ããããã±ãŒãžãããŒããããšã¡ã¢ãªãå¢ãããšæããŸãã
ãªãŒã¯ããå¯èœæ§ã®ãããã®ã«é¢ããŠã¯ãããã€ãã®ã°ããŒãã«å€æ°ãäœæããŸãããç¶æ ã远跡ããããã«ããããå¿ èŠã§ãã
@HazATã¯ããããã¯å¥åŠã§ããããã¹ãããªãŒã¯ãããã®ã«ååã§ãã jest
ã¯ãªãŒã¯ãæ€åºãããŠå€±æããŸãã ã³ãŒãããŒã¹ã«ãåãåé¡ãããã @sentry/node
ã®ã€ã³ããŒãã«ã³ã¡ã³ãããã ãã§ããªãŒã¯ã®åé¡ã解決ããŸããã
@michalkvasnicakç§ã¯ããã調æ»ããŸããããSentryãçŽæ¥åå ã§ã¯ãããŸããã
@sentry/node
ãã©ã³ã¹ããŒãã¯https-proxy-agent
ã«äŸåããŠããã agent-base
äŸåããŠããããã patch-core.jsãã¡ã€ã«ãå¿
èŠã§ããããããªãŒã¯ã®åå ã§ãïŒshrugïŒ
https://github.com/TooTallNate/node-agent-base/issues/22
ãã®å 容ããã¹ãã«ã³ããŒããããŒãçµ±èšã䜿çšããŠå®è¡ããããšã§ããããç°¡åã«ç¢ºèªã§ããŸãã
const url = require("url");
const https = require("https");
https.request = (function(request) {
return function(_options, cb) {
let options;
if (typeof _options === "string") {
options = url.parse(_options);
} else {
options = Object.assign({}, _options);
}
if (null == options.port) {
options.port = 443;
}
options.secureEndpoint = true;
return request.call(https, options, cb);
};
})(https.request);
https.get = function(options, cb) {
const req = https.request(options, cb);
req.end();
return req;
};
it("works", () => {
expect(true).toBe(true);
});
ããããããããã©ãŒã¯ããããåé¿çãæžãå¿ èŠããããŸãã
ããã®åé¿çã¯ãããŸããïŒ
https://nodejs.org/en/blog/release/v10.16.0/
ããã€ãã®ã¡ã¢ãªãªãŒã¯ãä¿®æ£ããŸããã誰ããããããã¹ãã§ããŸããïŒ
ããŒã11.10ã§ãåãåé¡ãçºçããŸãããããŒã12.3.1ã§ä¿®æ£ãããŠããããã§ãã
agent-base
åé¡ã«ã€ããŠãªãŒãã³ãªPRããããŸãïŒ //github.com/TooTallNate/node-agent-base/pull/25
ããããã©ãŒã¯ããŠYarn解å床ã®äŸåé¢ä¿ããªãŒããŒã©ã€ãããããããŒãžããæ¹æ³ãèŠã€ããããšãã§ããŸãã
å°ããªããããã¯ãããããŸããããHandlers.tsã«ãã¡ã€ã³ã®ã¯ãªãŒã³ã¢ããããªããdomain.createã®ã¿ã§ãããšãããªãŒã¯ãçºçããå¯èœæ§ããããŸããïŒ
äžçšåºŠã®èšäºãŸãã¯SOã¯ãremoveListenersãšdomain.exitãå¿
èŠã§ããããšã瀺åããŠããŸãã ããããããã«å¯Ÿãã決å®çãªçãã¯èŠã€ãããŸããã§ããã
æŽæ°ïŒãã³ãã©ãŒãdomain.exitãå éšçã«åŒã³åºãdomain.runã䜿çšããŠããããšãããããŸããã ããã§ããªã¹ããŒ/ãšããã¿ãŒãåé€ãããšéããçããå¯èœæ§ããããŸãããæ£çŽãªãšããããããŸããã
Node 12.4.0ã«ã¢ããã°ã¬ãŒãããŸããããSentryã«é¢é£ããŠããããã«èŠããæªãåäœããŸã èŠãããŸãã
ããã¯ã90ç§ä»¥äž--autocannonãªãã·ã§ã³ã䜿çšããŠå®è¡ãããããŒãã¯ãªããã¯ãã¯ã¿ãŒã®å®è¡ã§ãã
init
ããã ããšã¯ã¹ãã¬ã¹ãªã¯ãšã¹ããã³ãã©ãŒãªãinit
ïŒçŸåšã®æ¬çªã»ããã¢ããïŒã®ãªã¯ãšã¹ããã³ãã©ãŒãé 眮ãããŠããå Žåã«ã®ã¿ãå®éã«ãªãŒã¯ãçºçããããã«èŠããŸãã ãã³ãã©ãŒãªãã®å®è¡ã§GCãã©ãã®åºãèŠããšããããã¯ãã¹ãŠã»ãŒåãã¬ãã«ïŒ65ã70 mbïŒã«ããããã³ãã©ãŒã䜿çšããå®è¡ã§ã¯ãGCãµã€ã¯ã«ããšã«çŽ5mbäžæããŠããããã«èŠããŸãã
@ tstirrat15ãã®ä¿®æ£ã¯ãŸã ãªãªãŒã¹ãããŠããªãããããããããã®åé¡ããŸã çºçããŠããã®ã¯ãã®ããã§ãã ããããªãã·ã§ã³ã§ããå Žåãææ°ã®ãã¹ã¿ãŒããè©Šãããšãã§ããŸããïŒ
@ tstirrat15ä¿®æ£ãå«ãŸããŠãã5.4.2
ããªãªãŒã¹ãããŸãããè©ŠããŠã¿ãŠãã ãã:)
ããã¯ãv5.4.2ãé 眮ããå¥ã®å®è¡ã§ãã ããã¯ãŸã å°ãæŒããŠããããã§ã...
GCã¯åžžã«æ£ããèµ·åããã¡ã¢ãªãããŒã¹ã©ã€ã³ã«åŸ©å ããŸãã ã¡ã¢ãªäœ¿çšéã®å¢å ã¯ãã€ãã³ãããã³ã€ãã³ããã¥ãŒããåéããããã¬ããã¯ã©ã ã«ãã£ãŠåŒãèµ·ããããŸããã100ãã¬ããã¯ã©ã ã§åæ¢ãããã以äžå¢å ããããšã¯ãããŸããã 15ã30åã®ãã³ãã®ããã«è¡šç€ºãããããŒã¯ã¡ã¢ãªãããæç¹ã§åæ¢ãããã©ããã確èªã§ããã°äŸ¿å©ã§ãã
ããŒã...ããã§ããã ãã®PRãæ¬çªç°å¢ã«ç§»è¡ããåäœãå€åãããã©ããã確èªããŸãã ããããšãããããŸããïŒ
ãµãŒããŒã§webpackã䜿çšããŠSentryããã³ãã«ããããšã«é¢é£ããŠããããã§ããããã¯ãã¢ããªãWebpackã«ãã£ãŠãã«ããããŠããå Žåã«ã®ã¿çºçããŸãã @ sentry / nodeãå€éšã«è¿œå ãããšãã¡ã¢ãªã®åé¡ãä¿®æ£ãããŸããã ãªããããèµ·ããã®ãèãã¯ãããŸããïŒ
@tpbowdenããªãã¯ããã«ã€ããŠ
ãµãŒããŒãã³ãã«å ã®ãã¹ãŠã®äŸåé¢ä¿ãwebpackã«ãã³ãã«ããŠããŸãã ãã®ããã«ããŠãnode_modulesãªãã§Dockerã€ã¡ãŒãžãåºè·ã§ããŸãããäœããæ©åšSDKãå°ç¡ãã«ããŠããããã®æ¹æ³ã§ãã³ãã«ãããšã¡ã¢ãªãªãŒã¯ãçºçããŸãã
ããã€ãã®æé©åããã»ã¹ã«ãã£ãŠäœæããããã°ã§ããå¯èœæ§ããããŸãã ç§ã®å€§ãããªæšæž¬ã¯ãããã¯ããããããç°¡æœã ãšããããšã§ãã ããã€ãã®æé©åã¯ãããããã¡ã€ã³ã¢ãžã¥ãŒã«ã®äœ¿çšæ³ãå°ç¡ãã«ããŠããã scope.addEventProcessor
æž¡ãããã³ãŒã«ããã¯ã®ã¯ããŒãžã£ã¯ãã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§ã¯ãªããããè¡ããããã¹ãŠã®èŠæ±ã¯ããªãã®éã®ã¡ã¢ãªããªãŒã¯ããŠããŸãã
ãŸããwebpack / terserããŒãžã§ã³ããå°ãé ããŠããrazzle.jsã䜿çšããŠããŸããããããããã§ã«ä¿®æ£ãããŠããŸãã
ããã¯ãã¯ãæ©åšåŽã®ãã°ã§ã¯ãªãããã§ãã ç§ã¯ãããåŒãç¶ã調æ»ããå¿ èŠã«å¿ããŠåé¡ãéãããã®ã¹ã¬ãããææ°ã®ç¶æ ã«ä¿ã¡ãŸãã
ããã¯ãã¯ãæ©åšåŽã®ãã°ã§ã¯ãªãããã§ãã ç§ã¯ãããåŒãç¶ã調æ»ããå¿ èŠã«å¿ããŠåé¡ãéãããã®ã¹ã¬ãããææ°ã®ç¶æ ã«ä¿ã¡ãŸãã
æçš¿ããŠãã ãããããããšãããããŸãïŒ
@kamilogorekã³ãŒãã®ã©ãã§Scopeã€ã³ã¹ã¿ã³ã¹å
ã®_eventProcessors
é
åã«è¿œå ãããã€ãã³ãããã»ããµã³ãŒã«ããã¯ãåé€ãããããæããŠãã ããã èŠã€ãããŸããã ãã¹ãŠã®ãªã¯ãšã¹ãããã®é
åã«ã€ãã³ãããã»ããµã³ãŒã«ããã¯ãè¿œå ããŠããããã§ãåé€ãããããšã¯ãããŸããã ããããã©ã®ããã«åé€ãããã®ããç¥ã£ãŠããã°ããã°ãããããç解ããã®ã«åœ¹ç«ã€ãããããŸããã
ãããšãããªã¯ãšã¹ãããšã«äžæã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã¯ãã®ã¹ã³ãŒãå šäœã§ããïŒ åãªã¯ãšã¹ãã¯åãã¹ã³ãŒãã€ã³ã¹ã¿ã³ã¹ãååŸããŠããããã§ãð€
ãããšãããªã¯ãšã¹ãããšã«äžæã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã¯ãã®ã¹ã³ãŒãå šäœã§ããïŒ
ããã¯æ£ããã§ãã ãã ãã scope
ã¯ãæ°ããdomain
ã€ã³ã¹ã¿ã³ã¹ããšã«è€è£œããå¿
èŠããããŸãð€
ãã®ã³ãŒã«ã¹ã¿ãã¯ãåç §ããŠãã ããã
ãïŒ ç§ã¯äœãèŠã€ãããšæãã
dynamicRequireã䜿çšããŸãã
https://github.com/getsentry/sentry-javascript/blob/fd26d9fa273002502706b03fc1a9a46864cd8440/packages/hub/src/hub.ts#L465-L468
ããããdynamicRequireã³ãŒãã«ã¹ãããã€ã³ãããšïŒ
https://github.com/getsentry/sentry-javascript/blob/fd26d9fa273002502706b03fc1a9a46864cd8440/packages/utils/src/misc.ts#L28-L31
require
ã¯mod
ã§ã¯æªå®çŸ©ã§ãð€¯
ãããã£ãŠã getHubFromActiveDomain
é¢æ°ã®catch
ãããã¯ã«å
¥ãã代ããã«getHubFromCarrier()
ãŸãã
ç§ã®ã»ããã¢ããã§ã¯ã_everyting_ã¯webpackã«ãã³ãã«ãããŠãããããããããwebpackã«ãã£ãŠå£ããmod
ãªããžã§ã¯ãã«ããã€ãã®ä»®å®ããããŸãã ãããã©ã®ããã«ä¿®æ£ã§ãããã«ã€ããŠã®ã¢ã€ãã¢ã¯ãããŸããïŒ ð€
èŠçŽ
dynamicRequireã䜿çšããŸãã
mod.requireã¯æªå®çŸ©ã§ãïŒ
modãªããžã§ã¯ãã¯ã©ã®ããã«èŠããŸããïŒ
æçµçã«getHubFromCarrierã䜿çšããŸãã
node_modulesãã©ã«ããŒã«çŽæ¥Hubã¢ãžã¥ãŒã«ã«ããããæåã§é©çšããŸããã dynamicRequire
ã䜿çšããŠè¡ãåé€ãããã¡ã€ã«ã®å
é ã«import domain from 'domain';
ãè¿œå ãããšãããå®å
šã«æ©èœããããã«ãªããŸããã ãã以äžã®æŒãã¯ãããŸããïŒ ð
以åã¯dynamicRequireããã¯ãå¿ èŠã ã£ããããããŸããããæ°ããããŒãžã§ã³ã®webpackã§ã¯äžèŠã«ãªããŸãããïŒ ð€
ç§ã亀æããããšããŸããïŒ
const domain = dynamicRequire(module, 'domain');
ãšïŒ
const domain = require('domain');
ãããŠããã¯ãŸãããŸãåããŸãã ãããã®2ã€ã®ãœãªã¥ãŒã·ã§ã³ã®ã©ã¡ãã奜ããããããŸããã
ãã®ä¿®æ£ã§PRãéããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
@michalkvasnicakç§ã¯ããã調æ»ããŸããããSentryãçŽæ¥åå ã§ã¯ãããŸããã
@sentry/node
ãã©ã³ã¹ããŒãã¯https-proxy-agent
ã«äŸåããŠãããagent-base
äŸåããŠããããã patch-core.jsãã¡ã€ã«ãå¿ èŠã§ããããããªãŒã¯ã®åå ã§ãïŒshrugïŒhttps://github.com/TooTallNate/node-agent-base/issues/22
ãã®å 容ããã¹ãã«ã³ããŒããããŒãçµ±èšã䜿çšããŠå®è¡ããããšã§ããããç°¡åã«ç¢ºèªã§ããŸãã
ããããããããã©ãŒã¯ããããåé¿çãæžãå¿ èŠããããŸãã