Sentry-javascript: 10.13.0 ๋…ธ๋“œ์—์„œ @ sentry / node ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

์— ๋งŒ๋“  2018๋…„ 11์›” 22์ผ  ยท  50์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: getsentry/sentry-javascript

ํŒจํ‚ค์ง€ + ๋ฒ„์ „

  • [x] @sentry/browser
  • [x] @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์™€ ์—ฐ๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

In Progress Bug

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@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);
});

์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์„ ํฌํฌํ•˜๊ฑฐ๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  50 ๋Œ“๊ธ€

@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 ํ•ธ๋“ค๋Ÿฌ ์—†์ด๋„.

https://streamable.com/bad9j

๋„๋ฉ”์ธ๊ณผ ์ž์ฒด ๋ฒ”์œ„๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฏ€๋กœ ์„ฑ์žฅ๋ฅ ์ด ์•ฝ๊ฐ„ ๋” ํฝ๋‹ˆ๋‹ค.
์š”์ฒญ์— ๋ฐ˜๋Œ€ํ•˜์ง€๋งŒ 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 ์•„์ง ์ด๊ฒƒ์„ ์‚ดํŽด๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํž™์„ ์‚ดํŽด๋ณธ ํ›„์ด ์ค„์ด ๋ฌธ์ œ์˜ ์›์ธ์ด ๋  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

https://github.com/getsentry/sentry-javascript/blob/c27e1e32d88cc03c8474fcb1e12d5c9a2055a150/packages/node/src/handlers.ts#L233

๊ฒ€์‚ฌ๊ด€์€ eventProcessors ๋ชฉ๋ก์— ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
image

๋‚˜๋Š” ์‚ฌ๋ฌผ์ด ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๋Š” ์—†์ง€๋งŒ ์š”์ฒญ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๊ณ  ์ž˜๋ชป๋œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  (# 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, __importDefault

npm ์˜ค๋ฅ˜! ์ฝ”๋“œ 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์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

image

@MartijnHols ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ SDK์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์—ฌ์•ผํ•˜๋Š” ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ๋ชจํ—˜์‹ฌ์ด ์žˆ๋‹ค๋ฉด https://github.com/getsentry/sentry-javascript/pull/1919๋ฅผ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜

@HazAT ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ด์ ฏ๋ฐค ํ”„๋กœ๋•์…˜์— ์„ค์น˜ํ•˜๊ณ  (๊ทธ๋ž˜ํ”„์—์„œ 23:10์—) ์•„๋ž˜ ๊ฒฐ๊ณผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ „๋‚ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด 23 : 00-24 : 00 ๊ฒฝ์— CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์•ฝ๊ฐ„ ๊ธ‰์ฆํ–ˆ์ง€๋งŒ ์ด๋ณด๋‹ค ๋” ๋†’์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ CPU ์‚ฌ์šฉ๋Ÿ‰์€ ํ•ธ๋“ค๋Ÿฌ๊ฐ€์—†๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋พฐ์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ƒˆ ๋ฒ„์ „์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ํ™œ์„ฑํ™”๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช‡ ์‹œ๊ฐ„ ํ›„์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋น„ํ™œ์„ฑํ™” ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋‹น ์•ฝ 2.5 ๊ฐœ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

image

@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();
});

์ด๊ฒƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ˆ˜์ • ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

@couds ์ด ๊ตฌํ˜„์€ ์ •๋ง ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ คํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹๋Œ€ํ•ด ์ƒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฐ›๊ฒŒ๋˜๋ฉฐ ์ „์—ญ ์˜ค๋ฅ˜ / ์ž๋™ ์ด๋™ ๊ฒฝ๋กœ (๋˜๋Š” ๊ธฐ๋ณธ ํ†ตํ•ฉ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…)๋ฅผ ํฌ์ฐฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@HazAT ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ง€๋ถˆํ•ด์•ผ ํ•  ์ž‘์€ ๋Œ€๊ฐ€์ž…๋‹ˆ๋‹ค. ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์ด ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚˜๋Š” unCoughException / promise ์ด๋ฒคํŠธ์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋™ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ req ๊ฐœ์ฒด์— ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. @sentry/webpack-plugin ํ•˜์—ฌ ์†Œ์Šค ๋งต์„ ์„ผํŠธ๋ฆฌ์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹ํƒœ๊ทธ / ์ถ”๊ฐ€ ์ถ”๊ฐ€

ํ•œ ๊ฐ€์ง€ ๋”, ํŠธ๋žœ์žญ์…˜ (๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด)์ด๋ผ๋Š” ํƒœ๊ทธ๋ฅผ ํ•˜๋‚˜ ๋” ๋ถ™์—ฌ ๋„ฃ๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

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
image

yarn test:watch

image

image

@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 ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ ๋œ ๋…ธ๋“œ ํด๋ฆฌ๋‹‰ ์˜์‚ฌ ์‹คํ–‰์ž…๋‹ˆ๋‹ค.

์š”์ฒญ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์ œ์ž๋ฆฌ์—์žˆ์„ ๋•Œ๋งŒ ์‹ค์ œ๋กœ ๋ˆ„์ถœ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๊ฐ€์—†๋Š” ์‹คํ–‰์—์„œ 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 ๋ฐฐ์—ด์— ์ถ”๊ฐ€ ๋œ ์ด๋ฒคํŠธ ํ”„๋กœ์„ธ์„œ ์ฝœ๋ฐฑ์ด ์ฝ”๋“œ์—์„œ ์ œ๊ฑฐ ๋œ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์ด์ด ๋ฐฐ์—ด์— ์ด๋ฒคํŠธ ํ”„๋กœ์„ธ์„œ ์ฝœ๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ ˆ๋Œ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ ๋ฐฉ๋ฒ•์„ ์•Œ๋ฉด ๋ฒ„๊ทธ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Screen Shot 2020-03-23 at 15 49 03

์•„๋‹ˆ๋ฉด ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•˜๊ณ  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๋˜๋Š” ์ „์ฒด ๋ฒ”์œ„์ผ๊นŒ์š”? ๊ฐ ์š”์ฒญ์ด ๋™์ผํ•œ ๋ฒ”์œ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿค”

์•„๋‹ˆ๋ฉด ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•˜๊ณ  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๋˜๋Š” ์ „์ฒด ๋ฒ”์œ„์ผ๊นŒ์š”?

๋งž์•„์š”. ๊ทธ๋Ÿฌ๋‚˜ scope ๋Š” ๋ชจ๋“  ์ƒˆ domain ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋ณต์ œ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค ๐Ÿค”

๋‹ค์Œ ํ˜ธ์ถœ ์Šคํƒ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

https://github.com/getsentry/sentry-javascript/blob/fd26d9fa273002502706b03fc1a9a46864cd8440/packages/node/src/handlers.ts#L319 -L328

https://github.com/getsentry/sentry-javascript/blob/fd26d9fa273002502706b03fc1a9a46864cd8440/packages/hub/src/hub.ts#L442 -L457

https://github.com/getsentry/sentry-javascript/blob/fd26d9fa273002502706b03fc1a9a46864cd8440/packages/hub/src/hub.ts#L463 -L488

https://github.com/getsentry/sentry-javascript/blob/fd26d9fa273002502706b03fc1a9a46864cd8440/packages/hub/src/hub.ts#L479

ํ•˜์•„! ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์ฐพ์€ ๊ฒƒ ๊ฐ™์•„์š”.

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๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Screen Shot 2020-03-24 at 12 05 04

mod.require๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
Screen Shot 2020-03-24 at 12 20 01

mod ๊ฐ์ฒด์˜ ๋ชจ์Šต :
Screen Shot 2020-03-24 at 12 20 38

๊ฒฐ๊ตญ getHubFromCarrier๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Screen Shot 2020-03-24 at 12 21 22

node_modules ํด๋”์—์„œ ์ง์ ‘ ํ—ˆ๋ธŒ ๋ชจ๋“ˆ์„ ์ˆ˜๋™์œผ๋กœ ํŒจ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. dynamicRequire ์‚ฌ์šฉํ•˜์—ฌ ์ค„์„ ์ œ๊ฑฐํ•˜๊ณ  ํŒŒ์ผ ๋งจ ์œ„์— import domain from 'domain'; ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๋” ์ด์ƒ ๋ˆ„์ถœ์ด ์—†์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰

์ด์ „์—๋Š” dynamicRequire ํ•ดํ‚น์ด ํ•„์š”ํ–ˆ์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „์˜ ์›นํŒฉ์—์„œ๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ์š”? ๐Ÿค”

๋‚˜๋Š” ๋˜ํ•œ ๊ต์ฒดํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋‹ค :

const domain = dynamicRequire(module, 'domain');

์™€:

const domain = require('domain');

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ์†”๋ฃจ์…˜ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํ˜ธํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์ˆ˜์ •์œผ๋กœ PR์„ ์—ด๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰