@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์์ ์์ฒญ๊ณผ errorHandler๋ฅผ ์ ๊ฑฐํ์๋ง์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ค์ง๋ฉ๋๋ค. ๊ทธ๋์ ๊ทธ 2์ ์ฐ๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค
@abraxxas ์ด ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๊น? ์ด ๋ฉค ๋ฆฌํฌ๋ฅผ ์ ํํ ์ด๋ป๊ฒ ์ ๋ฐํฉ๋๊น?
์ด์์ด ์ค๋ช
์ ์๋ํ์ง๋ง ํต๊ณ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๊ณ ์ ๋ ์ ์ถํ์ง ์์ต๋๋ค.
@kamilogorek ๊ทํ์ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ด๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด ์์ https://github.com/sheerun/next.js/tree/with-sentry-fix/examples/with-sentry๋ฅผ ํ์ธํ๊ณ memwatch๋ฅผ server.js์ ์ถ๊ฐํ์ต๋๋ค.
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๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๊ด์ฐฐํ์ง ์์)๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ฅผ ์คํํ๊ณ gatling testsuite๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ์ต๋๋ค.
"/",
"/_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์์ ์์ฒญ๊ณผ errorHandler๋ฅผ ์ ๊ฑฐํ์๋ง์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ค์ง๋ฉ๋๋ค. ๊ทธ๋์ ๊ทธ 2์ ์ฐ๊ฒฐ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ฒญ์ด ๋๋ฌด ์ ๊ฑฐ๋ ๋ ธ๋ 8.x๋ฅผ ์ฌ์ฉ ํ์ต๋๊น?
@abraxxas๊ฐ ํ์ธ๋์์ต๋๋ค. ๋ ธ๋ 10 + ๊ฐ ๋ฆฌ์์ค์ ๋ํด ~ 300req๊ฐ ์์ ์ ์ํํฉ๋๋ค. ๋ ์กฐ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ!
@kamilogorek intersting, ๊ทธ๋ฌ๋ ๋น์ ์ด ๋น์ ์ ํ ํฌ๊ธฐ๋ฅผ ๋ณด๋ฉด
์ฌ์์ฐ ๋น์ ์ ํธ๋ค๋ฌ์์ด ์ฝ 20MB์ ๋จธ๋ฌด๋ฅด๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค
๊ทธ๋ฌ๋ ๊ทธ๋ค๊ณผ ํจ๊ป ๋น ๋ฅด๊ฒ ์ฆ๊ฐํฉ๋๋ค.
ํธ๋ค๋ฌ๊ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋
์์ฒญ์ผ๋ก ์ธํด ์ผ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฆ๊ฐํฉ๋๋ค.
๋ฒ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์๋ ์ฌ์ ํ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ณด์ด ๋ฐ์์ด.
2018 ๋ 11 ์ 29 ์ผ ๋ชฉ์์ผ 12:45 Kamil Ogรณrek < [email protected] ์์ฑ :
@abraxxas https://github.com/abraxxas ์ฑ๊ณต์ ์ผ๋ก ์ฌํํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ฒ๋ ์ฌ์ ํ ์์ฒด์ ์ผ๋ก ์์ฒญ ๊ฐ์ฒด๋ฅผ ๋์ถํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
Sentry ํธ๋ค๋ฌ ์์ด๋.๋๋ฉ์ธ๊ณผ ์์ฒด ๋ฒ์๋ฅผ ์ฐ๊ฒฐํ๋ฏ๋ก ์ฑ์ฅ๋ฅ ์ด ์ฝ๊ฐ ๋ ํฝ๋๋ค.
์์ฒญ์ ๋ฐ๋ํ์ง๋ง GC์ ์์ฒญ๊ณผ ํจ๊ป ํ์ฉ๋ฉ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/getsentry/sentry-javascript/issues/1762#issuecomment-442804709 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AIbrNlgPjPd5Jra1aahR-Dthf7XvbCexks5uz8jjgaJpZM4YvOA2
.
@abraxxas ๋ ๋ด ์ด์ ๋๊ธ (๋ด๊ฐ ์ ๊ฑฐํ ๋๊ธ)์ ๋ฌด์ํฉ๋๋ค. ์์ ํ ์ฐ๋ฆฌ ํธ์
๋๋ค. :)
Node ํต์ฌ ์์ฒด์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋๊ธ์ ์ฐธ์กฐํ์ญ์์ค https://github.com/getsentry/sentry-javascript/issues/1762#issuecomment -444126990
@kamilogorek ์์ง ์ด๊ฒ์ ์ดํด๋ณผ ๊ธฐํ๊ฐ ์์์ต๋๊น? ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํค๊ณ ์์ต๋๋ค. ํ์ ์ดํด๋ณธ ํ์ด ์ค์ด ๋ฌธ์ ์ ์์ธ์ด ๋ ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ฒ์ฌ๊ด์ eventProcessors
๋ชฉ๋ก์ ์์ฒ ๊ฐ์ ํญ๋ชฉ์ ํ์ํ์ต๋๋ค.
๋๋ ์ฌ๋ฌผ์ด ์ด๋ป๊ฒ ์ค๊ณ๋์๋์ง์ ๋ํ ์ปจํ ์คํธ๋ ์์ง๋ง ์์ฒญ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฒ์๊ฐ ์ง์ ๋์ง ์์๊ณ ์๋ชป๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ณ (# 1773 ์ฐธ์กฐ) ๋ชจ๋ ๊ฒ์ด ๊ธ๋ก๋ฒ ์ํ์์ ๊ด๋ฆฌ๋๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ณ ์์ฒญ ์ข ๋ฃ
@abraxxas @tpbowden Node์ ์ฝ์ด ์์ฒด์ ๋๋ฉ์ธ ๋ชจ๋์ด ์ ์ถ๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ณ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ฝ์ด์ ๊ณ ์ ๋๊ธฐ ์ ์ ์์ ํด๊ฒฐ์ฑ ์ ๋ง๋ จํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ๊ด๋ จ ๋ฌธ์ : https://github.com/nodejs/node/issues/23862
@kamilogorek ์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ ์์ ์์ ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ๋ ธ๋ ๋ฌธ์ ์ ๋ํ ์งํ์ด ์๋นํ ๋๋ ค ๋ณด์ ๋๋ค.
ํ์ฌ PM2 ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํน์ ์๊ณ ๊ฐ์ ๋๋ฌํ๋ฉด Node.js ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ๊ณ ์์ต๋๋ค. https://pm2.io/doc/en/runtime/features/memory-limit/#max -memory-threshold-auto-reload
๋จ์ ํ ์คํธ๋ฅผ ์ํด ์คํ์ค ์ฌ์ฉ. ๋์ถ์ ์ฌ์ ํ โโ์กด์ฌํฉ๋๋ค. ๋์๋ ๋๋ฒ๊ทธํ๊ธฐ๊ฐ ํ๋ค ์ ์์์ ์๊ณ ์์ต๋๋ค. ์์ ์์ํ ETA๊ฐ ์์ต๋๊น?
1 ๊ฐ์ ํ ์คํธ ์๋ฃ
ํ ์คํธ ๊ธฐ๊ฐ : 1832ms
๋ค์ ๋์๊ฐ ๊ฐ์ง๋์์ต๋๋ค .__ extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __values, __read, __spread, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefaultnpm ์ค๋ฅ! ์ฝ๋ ELIFECYCLE
npm ์ค๋ฅ! ์ค๋ฅ ๋ฒํธ 1
npm ์ค๋ฅ! [email protected] ํ ์คํธ :lab build/test
npm ์ค๋ฅ! ์ข ๋ฃ ์ํ 1
npm ์ค๋ฅ!
npm ์ค๋ฅ! [email protected] ํ ์คํธ ์คํฌ๋ฆฝํธ์์ ์คํจํ์ต๋๋ค.
npm ์ค๋ฅ! ์ด๊ฒ์ ์๋ง๋ npm์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์์ ์ถ๊ฐ ๋ก๊น ์ถ๋ ฅ์ด์์ ์ ์์ต๋๋ค.npm ์ค๋ฅ! ์ด ์คํ์ ์ ์ฒด ๋ก๊ทธ๋ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
npm ์ค๋ฅ! /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์์ ๊ฐ๋ฐํ๊ณ ์๋ (๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ง์ ์์กด์ฑ์ ์์กดํ๋) ํ๋ก์ ํธ ์ค ํ๋๋ ๋์ถ์ ์ผ์ผํค์ง ์์ต๋๋ค (์ ์ด๋ ๊ทธ๋ค์ lab์์ ์กํ์ง ์์ต๋๋ค).
@sunknudsen ๋ค์๊ฐ. ๋ด๊ฐ ์ดํดํ๋ ํ (๋ ์ด์ ์ฌ์ฉ๋์ง ์๋) ๋๋ฉ์ธ ํจํค์ง์ ์ฝ์์ ์กฐํฉ์ ๋๋ค. 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์) ์๋ ๊ฒฐ๊ณผ๋ก ํธ๋ค๋ฌ๋ฅผ ๋ค์ ํ์ฑํํ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ์์ ๋ณผ ์ ์๋ฏ์ด 23 : 00-24 : 00 ๊ฒฝ์ CPU ์ฌ์ฉ๋์ด ์ฝ๊ฐ ๊ธ์ฆํ์ง๋ง ์ด๋ณด๋ค ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ค CPU ์ฌ์ฉ๋์ ํธ๋ค๋ฌ๊ฐ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋พฐ์กฑํฉ๋๋ค. ์ด๊ฒ์ด ์ ๋ฒ์ ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๊ฒ์ธ์ง ์๋๋ฉด ํ์ฑํ๋๋ ํธ๋ค๋ฌ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋ช ์๊ฐ ํ์ ํธ๋ค๋ฌ๋ฅผ ๋ค์ ๋นํ์ฑํ ํด ๋ณด๊ฒ ์ต๋๋ค. ์๊ฐ๋น ์ฝ 2.5 ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
@MartijnHols ์ฌ์ฉํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋ช
์ฌํด์ผ ํ ๋ ๊ฐ์ง ์ฌํญ์ ๋
ธ๋์ ๋๋ฉ์ธ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ ์ด ์ต๊ทผ์ 11.10
๋์ฐฉํ ๊ฒ์
๋๋ค.
๋ํ 5.0.0-beta1
์ (๋) ์ค์๋ก latest
๋ก ํ๊ทธ๊ฐ ์ง์ ๋์๊ธฐ ๋๋ฌธ์ ๊ฒ์๋ฅผ ์ทจ์ํด์ผํ์ต๋๋ค. 5.0.0-rc.1
์ด ์ด์ ์ต์ next
๋ฒ์ ์
๋๋ค.
5.0.0-rc.1
์๋ํด๋ณด์ญ์์ค. ์ด๋ฒคํธ ๋๊ธฐ์ด ๋ฐฉ์์ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ฌ๋ก๋ / ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฌ๊ฒ ํฅ์ ์์ผฐ์ต๋๋ค.
11.12 ๋ ธ๋๋ก ์ ๋ฐ์ดํธํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฐ CPU ์ฌ์ฉ๋์ด ์์ ํ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํธ๋ค๋ฌ๋ฅผ ๋นํ์ฑํ ํ ๊ฒ๊ณผ ๋น๊ตํ ๋ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ๋์ ๋๋ ์ฐจ์ด๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ก ์ค๋ฅ๋ฅผ ์ ์ก์๋ด๋ ๊ฒ ๊ฐ์ต๋๋ค (๋ ๋ง์ ์ฝ์ "breadcrumbs"๊ฐ์์ ์ ์์ต๋๋ค). 5.0.0์์ ๋ฌด์์ ํ์ธํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
LGTM. ๊ฐ์ฌ!
๋๋ ์ด๊ฒ๋ ์๋ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. @HazAT 11.10
์ ์์ ์ด ์ด๋ฏธ ํ์ฑ LTS ๋ฆด๋ฆฌ์ค 10.x
๋ฐฑ ํฌํธ๋์๋์ง ์๊ณ ์์ต๋๊น?
@adriaanmeuris ๋๊ตฐ๊ฐ๊ฐ 10.x
๋ก ๋ฐฑ ํฌํธ ๋ ๊ฒ์ธ์ง ๋ฌผ์ด ๋ณด์์ง๋ง , ๊ทธ๋ ๊ฒ ํ ๊ฒ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์ฐธ์กฐ : https://github.com/nodejs/node/pull/25993#issuecomment -463957701
Express ๋ฏธ๋ค์จ์ด์์ ํด๋ผ์ด์ธํธ ๋ฐ ๋ฒ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
ํจ์๋ฅผ ๋ด๋ณด๋ด๋ 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 ์ด ๊ตฌํ์ ์ ๋ง ํ๋ฅญํฉ๋๋ค. ๊ณ ๋ คํด์ผ ํ ํ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
๋ชจ๋ ์์ฒญ์ โโ๋ํด ์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ฐ๊ฒ๋๋ฉฐ ์ ์ญ ์ค๋ฅ / ์๋ ์ด๋ ๊ฒฝ๋ก (๋๋ ๊ธฐ๋ณธ ํตํฉ์ด ์ํํ๋ ๋ค๋ฅธ ์์ )๋ฅผ ํฌ์ฐฉํ์ง ์์ต๋๋ค.
@HazAT ๊ฐ์ฌํฉ๋๋ค, ๋๋ ๊ทธ๊ฒ์ ์๊ณ ์์ง๋ง ์ง๋ถํด์ผ ํ ์์ ๋๊ฐ์ ๋๋ค. ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ด ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์์ ์ ์ํํ์ต๋๋ค.
@sentry/webpack-plugin
ํ์ฌ ์์ค ๋งต์ ์ผํธ๋ฆฌ์ ์
๋ก๋ํฉ๋๋ค.ํ ๊ฐ์ง ๋, ํธ๋์ญ์ (๊ธฐ๋ณธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด)์ด๋ผ๋ ํ๊ทธ๋ฅผ ํ๋ ๋ ๋ถ์ฌ ๋ฃ๋ ๊ฒ์ ์์์ต๋๋ค.
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 / node 5.1.0์ ์ฌ์ฉํ์ฌ Node 11.14.0์์ ์ฌ์ ํ ์ฌํ ๊ฐ๋ฅํฉ๋๋ค.
์ฐ๋ฆฌ์๊ฒ ๋์ถ์ @ sentry / node์ i18next-express-middleware ๊ฐ์ ์ํธ ์์ฉ์ผ๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ์ ์ต์คํ๋ ์ค ์ฑ์ 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 ํ์ผ์ด ํ์ํฉ๋๋ค _and_ ์ด๊ฒ์ด ๋์๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค.
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์ด ์ด๋ ค ์์ต๋๋ค : https://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-70mb)์ ์์ผ๋ฉฐ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ ์คํ์ ๊ฐ GC์ฃผ๊ธฐ์์ ์ฝ 5mb๊ฐ ์์นํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
@ tstirrat15 ์ด ์์ ์ฌํญ์ ์์ง ๋ฆด๋ฆฌ์ค๋์ง ์์
@ tstirrat15 5.4.2
์์ ์ฌํญ์ด ํฌํจ ๋ ๋ฒ์ ์ด ์ถ์๋์์ต๋๋ค. ํ๋ฒ ์๋ํด๋ณด์ธ์. :)
๋ค์์ v5.4.2๊ฐ ์ ์ฉ๋ ๋ ๋ค๋ฅธ ์คํ ์ ๋๋ค. ์์ง๋ ์ฝ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค ...
GC๋ ํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์์๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ธฐ์ค์ ์ผ๋ก ๋ณต์ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ๋ ์ด๋ฒคํธ ๋ฐ ์ด๋ฒคํธ ํ์์ ์์ง ๋ ์ด๋ ๊ฒฝ๋ก๋ก ์ธํด ๋ฐ์ํ์ง๋ง ์ด๋ ๊ฒฝ๋ก๊ฐ 100 ๊ฐ์์ ์ค์ง๋๊ณ ๋ ์ด์ ์ฆ๊ฐํ์ง ์์ต๋๋ค. ~ 15-30 ๋ถ ๋คํ์ ๊ฐ์ ๊ฒ์ ๋ณผ ์ ์๊ณ ํผํฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ ์์ ์์ ๋ฉ์ถ๋ ์ง ์ฌ๋ถ๋ฅผ ๋ณผ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
ํ ... ์ข์ ๊ฒ ๊ฐ๋ค์. ์ด PR์ ํ๋ก๋์ ์ ์ ๋ฌํ๊ณ ๋์์ด ๋ณ๊ฒฝ๋๋์ง ํ์ธํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์๋ฒ์์ webpack์ ์ฌ์ฉํ์ฌ Sentry๋ฅผ ๋ฒ๋ค๋งํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฑ์ด Webpack์ ์ํด ๋น๋ ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค. @ sentry / node๋ฅผ ์ธ๋ถ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ์์ญ๋๊น?
@tpbowden ๋น์ ์ด ๋ง์์, ์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ SDK v5.15.0๊ณผ node v12.3.1์ ์คํํ๊ณ ์์๋๋ฐ, ๋ ๋ค ์ฌ๊ธฐ์ ์ธ๊ธ ๋ ๋ชจ๋ ํ์ ์์ ์ฌํญ์ ํฌํจํด์ผํ์ต๋๋ค.
๋ด ์๋ฒ ๋ฒ๋ค ๋ด์ ๋ชจ๋ ์ข ์์ฑ์ webpack๊ณผ ๋ฒ๋ค๋ก ๋ฌถ์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด node_modules์์ด ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ์ก ํ ์ ์์ง๋ง ๋ฌด์ธ๊ฐ ์ผํธ๋ฆฌ 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์ ๋ฒ๋ค๋ก ์ ๊ณต๋๋ฏ๋ก mod
๊ฐ์ฒด์ ๋ํ ๊ฐ์ ์ด ์นํฉ์ ์ํด ์์๋์์ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ๐ค
์์ฝ
dynamicRequire๋ฅผ ์ฌ์ฉํฉ๋๋ค.
mod.require๊ฐ ์ ์๋์ง ์์์ต๋๋ค.
mod ๊ฐ์ฒด์ ๋ชจ์ต :
๊ฒฐ๊ตญ getHubFromCarrier๋ฅผ ์ฌ์ฉํฉ๋๋ค.
node_modules ํด๋์์ ์ง์ ํ๋ธ ๋ชจ๋์ ์๋์ผ๋ก ํจ์นํ์ต๋๋ค. dynamicRequire
์ฌ์ฉํ์ฌ ์ค์ ์ ๊ฑฐํ๊ณ ํ์ผ ๋งจ ์์ import domain from 'domain';
๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค! ๋ ์ด์ ๋์ถ์ด ์์ต๋๋ค! ๐
์ด์ ์๋ dynamicRequire ํดํน์ด ํ์ํ์ง๋ง ์ต์ ๋ฒ์ ์ ์นํฉ์์๋ ๋ ์ด์ ํ์ํ์ง ์์๊น์? ๐ค
๋๋ ๋ํ ๊ต์ฒดํ๋ ค๊ณ ์๋ํ๋ค :
const domain = dynamicRequire(module, 'domain');
์:
const domain = require('domain');
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ํ ์ ์๋ํฉ๋๋ค. ์ด ๋ ๊ฐ์ง ์๋ฃจ์ ์ค ์ด๋ค ๊ฒ์ ์ ํธํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด ์์ ์ผ๋ก PR์ ์ด๊ฒ ์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@michalkvasnicak ๋๋ ์ด๊ฒ์ ์กฐ์ฌํ์ผ๋ฉฐ Sentry์ ์ํด ์ง์ ๋ฐ์ํ ๊ฒ์ด ์๋๋๋ค.
์ฐ๋ฆฌ์
@sentry/node
์ ์ก์https-proxy-agent
์ ๋ํ ์ข ์์ฑ์ด ์์ต๋๋ค.agent-base
์ ์ข ์์ฑ์ด ์์ผ๋ฉฐ ์ด๋ patch-core.js ํ์ผ์ด ํ์ํฉ๋๋ค _and_ ์ด๊ฒ์ด ๋์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.https://github.com/TooTallNate/node-agent-base/issues/22
์ฝํ ์ธ ๋ฅผ ํ ์คํธ์ ๋ณต์ฌํ๊ณ ํ ํต๊ณ๋ก ์คํํ์ฌ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์๋ง๋ ๊ทธ๊ฒ์ ํฌํฌํ๊ฑฐ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ฑํด์ผ ํ ๊ฒ์ ๋๋ค.