Sentry-javascript: ๋…ธ๋“œ ์ œ์•ˆ: `unhandledRejection`์— ์˜ค๋ฅ˜ ๊ธฐ๋ก

์— ๋งŒ๋“  2019๋…„ 02์›” 19์ผ  ยท  41์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: getsentry/sentry-javascript

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

  • [ ] @sentry/browser
  • [x] @sentry/node
  • [ ] raven-js
  • [ ] raven-node _(๋…ธ๋“œ์šฉ ๋ ˆ์ด๋ธ)_
  • [ ] ๋‹ค๋ฅธ:

๋ฒ„์ „:

4.6.1

์„ค๋ช…

๊ธฐ๋ณธ์ ์œผ๋กœ Node๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์•ฝ์† ๊ฑฐ๋ถ€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Sentry๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ unhandledRejection ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์กด์žฌ ํ•˜๊ณ  Sentry๊ฐ€ ๊ทธ๋Ÿฌํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋ก

๋‚˜๋Š” Sentry๊ฐ€ ์ฆ‰์‹œ ์ œ๊ณต๋˜๋Š” ๊ฒฝํ—˜๊ณผ ๋™๋“ฑ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ•ธ๋“ค๋Ÿฌ์— ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๋ฌธ์„œ๋Š” ์ด ๋™์ž‘๊ณผ ๋กœ๊น…์„ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

uncaughtException ์™€ unhandledRejection ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Sentry๋Š” uncaughtException ๋Œ€ํ•œ ๋กœ๊น…์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. โ€” unhandledRejection ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋…ธ๋“œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿค”

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

์ข‹์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ debug: true ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฒฐ๊ตญ, ์˜์‹์ ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์˜ค๋ฅ˜ ์ŠคํŠธ๋ฆผ์„ Sentry๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

Sentry๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๋กœ๊น…์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์•ฝ์† ๊ฑฐ๋ถ€์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋น„๋ก ์ด ๋™์ž‘์˜ ์ฐจ์ด๋Š” Sentry๋ณด๋‹ค Node์—์„œ ๋” ๋ถˆ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.)

Sentry๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‚ด ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ํŠนํžˆ dev์—์„œ ์ฝ˜์†” ๋กœ๊น…์„ ๋ณ„๋„์˜ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค”

์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ ๋กœ๊น… ๋™์ž‘์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ์˜ ๊ฒฝ์šฐ ๋กœ๊ทธ ํ˜ธ์ถœ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋…ธ๋“œ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌธ์„œ์— ๋ฉ”๋ชจ๋ฅผ ๋‚จ๊ธฐ๊ณ  ๋– ๋‚˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at:', p, 'reason:', reason);
});

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฒฝ๊ณ ๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ์Šค๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ Sentry๋Š” ํŠน๋ณ„ํ•œ ์ผ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ์žกํžˆ์ง€ ์•Š์€ ์˜ˆ์™ธ๋Š” ๋กœ๊ทธ ํ˜ธ์ถœ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋…ธ๋“œ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ๊ฒŒ ์‚ฌ์‹ค์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Sentry๋Š” ๊ธฐ๋ณธ ๋…ธ๋“œ ๋™์ž‘(log + exit)์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” uncaughtException ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ( defaultOnFatalError )๋Š” ์ž์ฒด ๋กœ๊ทธ ํ˜ธ์ถœ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/getsentry/sentry-javascript/blob/4.6.3/packages/node/src/handlers.ts#L282.

ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๋กœ๊น…์„ "๋ณต์›"ํ•˜๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์•ฝ์† ๊ฑฐ๋ถ€์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋งˆ์ง€๋ง‰ ์˜๊ฒฌ์— ๋”ฐ๋ฅด๋ฉด ์ด์ œ Sentry๊ฐ€ ์žกํžˆ์ง€ ์•Š์€ ์˜ˆ์™ธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์•ฝ์† ๊ฑฐ๋ถ€์— ๋Œ€ํ•œ ๋กœ๊น…์„ ๋ณต์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด๊ฐ€ ๋‹จ์ง€ ๋•Œ๋ฌธ์— ๋‚ด ์ฝ”๋“œ์—์„œ ์‹ค์ˆ˜๋ฅผํ–ˆ๋‹ค๋ฉด ์„ผํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ถ๊ธˆํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌ uncaughtException ๋‚ด ๋กœ๊ทธ์— ์žˆ์—ˆ๊ณ ,ํ•˜์ง€ unhandledRejection . ์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‘˜ ๋‹ค ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ๊ธฐ๋กํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Node์˜ ์ฝ”์–ด์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

ฮป: node --unhandled-rejections=warn app.js

๋˜ํ•œ ๊ธฐ๋ณธ ๋ฌธ์„œ ํŽ˜์ด์ง€ https://github.com/getsentry/sentry-docs/pull/1099 ์— ํฌํ•จํ•˜์—ฌ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

uncaughtException ์™€ unhandledRejection ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Sentry๋Š” uncaughtException ๋Œ€ํ•œ ๋กœ๊น…์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. โ€” unhandledRejection ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋…ธ๋“œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿค”

unhandledRejection์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

ํ•˜๋‚˜๋Š” ์ค‘์š”ํ•˜๊ณ ( unhandledException ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•จ) ํ•˜๋‚˜๋Š” ์ •๋ณด์šฉ(๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฝ๊ณ ์ž„)์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฉด --unhandled-rejections ๊ฐ€ none ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋ฅผ ๋‚ด๋ณด๋‚ด CLI ๋™์ž‘์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ณต์‹ ๋…ธ๋“œ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋น„ํ‘œ์ค€์ด _๋ฉ๋‹ˆ๋‹ค_.

์ผ๋‹จ Node๊ฐ€ unhandledRejection ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ด๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด(ํ˜„์žฌ 4๊ฐœ ๋ฒ„์ „์— ๋Œ€ํ•ด ๋งํ•ฉ๋‹ˆ๋‹ค:P), ๊ณต์‹ ์‚ฌ์–‘๊ณผ๋„ ์ผ์น˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฉด CLI ๋™์ž‘์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

@kamilogorek , ํ•˜์ง€๋งŒ node ์‹คํ–‰ํ•  ๋•Œ unhandledRejection ๋ฅผ console ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ณต์‹ ๋…ธ๋“œ ๋ฌธ์„œ๊ฐ€ ๋ฌด์—‡์„ ๋งํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์ ์–ด๋„ ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ–‰๋™์ž…๋‹ˆ๋‹ค.

unhandledRejection ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ @freeall . ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด SDK๊ฐ€ ์—†์–ด๋„ ์—ฌ์ „ํžˆ ๊ธฐ๋ก๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

process.on('unhandledRejection', () => `ยฏ\_(ใƒ„)_/ยฏ`);

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” https://docs.sentry.io/platforms/node/default-integrations/๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ํ†ตํ•ฉ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ž์ฒด์— ๊ฒฐํ•ฉ๋˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋œ ํ†ตํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ•˜๋Š” ์ผ๊ณผ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒฝ์šฐ ๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€
์ด ํ†ตํ•ฉ์€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์ „์—ญ ๊ฑฐ๋ถ€ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. "๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐฉ์ถœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์—ฌ์ „ํžˆ ๊ฒฝ๊ณ ๋ฅผ ์›ํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค." - ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

@kamilogorek ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ

Sentry๊ฐ€ ์—†๋Š” unhandledRejection ์žˆ์œผ๋ฉด ์ฝ˜์†”์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
Sentry์— unhandledRejection ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฝ˜์†”์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Sentry๊ฐ€ ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด Node.js๊ฐ€ ์„ค๊ณ„๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค ยฏ_(ใƒ„)_/ยฏ
ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. SDK์˜ ์ฃผ์š” ๋ชฉ์ ์ธ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— SDK๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋…ธ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋Š”์ง€๋Š” ๋งž์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์‚ฌ๋žŒ๋“ค์ด ๋ฌป๋Š” ๊ฒƒ์€ ๋…ธ๋“œ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ชจ๋ฐฉํ•˜๊ณ  ์ฝ˜์†”์— ๊ธฐ๋กํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋™์ž‘์€ Sentry์™€ ๊ฐ™์€ ๋„๊ตฌ์—์„œ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‹น์‹ ์€ ์ด ๋™์ž‘์„ ์„ค์ •ํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ํ† ๋ก ์„ ๊ณ„์†ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋‹ต๋ณ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :)

@freeall๋‹˜๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ํ•ญ์ƒ ์–‘๋ฉด ๋ณด๊ธฐ ์ข‹๋„ค์š” :)

๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด: Sentry๋ฅผ ํ™œ์„ฑํ™”ํ•  ๋•Œ unhandledException (exit + log)์˜ ๋™์ž‘์€ ์œ ์ง€๋˜์ง€๋งŒ unhandledRejection (log)์˜ ๋™์ž‘์€ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

|ํ•ธ๋“ค๋Ÿฌ|๋กœ๊ทธ|์ข…๋ฃŒ|
|-|-|-|
| unhandledException ๊ธฐ๋ณธ๊ฐ’|์˜ˆ|์˜ˆ|
| unhandledException ๋ณด์ดˆ|์˜ˆ|์˜ˆ|
| unhandledRejection ๊ธฐ๋ณธ๊ฐ’|์˜ˆ|์•„๋‹ˆ์š”|
| unhandledRejection ๋ณด์ดˆ|์•„๋‹ˆ์š”|์•„๋‹ˆ์š”|

ํ˜„์žฌ ๊ณต์‹ ๋…ธ๋“œ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ "์˜ˆ์ƒ๋Œ€๋กœ"๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Sentry๊ฐ€ unhandledRejection ๋Œ€ํ•œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์š”์ ์„ ๋ด…๋‹ˆ๋‹ค. Sentry๋Š” ๋˜ํ•œ --unhandled-rejections ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋ฉฐ, ํ”Œ๋ž˜๊ทธ๊ฐ€ none ๋˜๊ณ  Sentry๊ฐ€ ๊ณ„์† ๊ธฐ๋กํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@freeall ์ฃผ์„์€ ์ด๊ฒƒ์„ ์•„์ฃผ ์ž˜ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

Sentry ์‚ฌ์šฉ์ž๋Š” Sentry๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์•ฝ์† ๊ฑฐ๋ถ€๋Š” "2๊ธ‰ ์˜ค๋ฅ˜"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ์˜ค๋ฅ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ฑ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž(์ € ํฌํ•จ)๊ฐ€ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ์•ž์œผ๋กœ ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด Sentry๋Š” ์ฝ˜์†”์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด์ง€ ๋ถ„๋ช…ํ•˜๋ฉฐ ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ ๋ณด์ดˆ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ฝ˜์†”์—์„œ ์˜ค๋ฅ˜์˜ ์ผ๋ถ€ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์นจ๋ฌต์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์„ผํŠธ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ถ”๋ก  ( @kamilogorek ์ž‘์„ฑ )

์ด๊ฒƒ์ด Node.js๊ฐ€ ์„ค๊ณ„๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์•ฝ๊ฐ„ ๋น„๋ฐ€์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ดˆ๊ฐ€ ํ–‰๋™ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ง€์‹œํ•ฉ๋‹ˆ๊นŒ?

์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ์— ๋Œ€ํ•ด ์•Œ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

a) sentrys ๋‚ด๋ถ€ ์ž‘๋™(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก)

b) ๋…ธ๋“œ ๋‚ด๋ถ€ ์ž‘๋™(ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง)

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ดํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ž˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋ฌผ๋ก  "๊ธ€์Ž„, ์‚ฌ์šฉ์ž๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚ด๋ถ€์—์„œ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค"๋Š” ๋ง์€ ์˜ณ์ง€๋งŒ ํ˜„์‹ค์€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ๋ณด์ดˆ์˜ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ "๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ์„ฑ์‹คํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

TLDR: IMOH ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ๋†’์ด๊ณ  ์ดˆ๋ณด์ž ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ๋ฅผ ์ค„์ด๋ ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@OliverJash , @freeall
์ด ๋ฌธ์ œ์— ์–ด๋–ค ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๊นŒ?

@schhumannd ๋กœ๋“œ ๋ฐฉ๋ฒ•์—์„œ ์Šค๋‹ˆํŽซ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋Œ€๋‹ต์ด ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Sentry๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ์žก์•„๋จน๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฒ„๊ทธ๋ฅผ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ• ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ Sentry์™€ ๊ฐ™์€ ๋„๊ตฌ์˜ ์ตœ์šฐ์„  ์ˆœ์œ„๋Š” ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์žก์•„๋‚ด๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

...
if (isUsingSentry) {
  // Log to console because Sentry overwrites standard behavior. https://github.com/getsentry/sentry-javascript/issues/1909.
  // Note that it doesn't overwrite for uncaughtException.
  process.on('unhandledRejection', console.error)
}
...

๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์„ผํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ•ดํ‚น ์ž‘์—… ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. React Native๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@OliverJAsh , @kamilogorek
์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Sentry๋Š” ์ฝ˜์†”์— ์˜ค๋ฅ˜๊ฐ€ ๊ธฐ๋ก๋˜๋Š” ๋ฐฉ์‹์„ ์ ˆ๋Œ€ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ฝ˜์†” ๊ธฐ๋ก์ด ์–ต์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— Node๋งŒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋””๋ฒ„๊น…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์ผ์ด๋ฉฐ JavaScript์šฉ ๋ฌธ์„œ์—์„œ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์Šคํ…Œ์ด์ง• ๋นŒ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ์ฝ˜์†”์„ ๋ณผ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋  ๋•Œ๊นŒ์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜ค๋ฅ˜ ๋ณด๊ณ  ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ •๋ง ํ˜•ํŽธ์—†๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด๋ฉฐ, ํ–‰๋ณตํ•œ ๊ณ ๊ฐ์„ ์›ํ•œ๋‹ค๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ „์— ๋งํ–ˆ๋“ฏ์ด ์•ฝ์† ๊ฑฐ๋ถ€๋Š” 2๊ธ‰ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์น˜๋ช…์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์–ต์ œ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์•ฝ๊ฐ„์˜ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ์ฝ˜์†” ๋กœ๊น…์ด ์–ต์ œ๋˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

Sentry๋Š” window.onunhandledrejection ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” false ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ฝ˜์†” ๋กœ๊น…์„ ๋ช…์‹œ์ ์œผ๋กœ ์–ต์ œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, Sentry๋Š” ๊ธฐ๋ณธ ๋™์ž‘์„ _does_ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šด ์ข‹๊ฒŒ๋„ ๊ธฐ์กด ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ฝ˜์†” ๋กœ๊น…์„ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๋Š” ํ•ดํ‚ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Sentry๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

window.onunhandledrejection = () => true;

์ด์ œ ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ฌด์˜๋ฏธํ•œ ํ•ดํ‚น ์—†์ด ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค ๐Ÿ™‚

@schmannd ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š”

@thomas-darling ๋ธŒ๋ผ์šฐ์ € ๋ณ€๊ฒฝ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์•ฝ์†์— ๋Œ€ํ•ด์„œ๋„ true ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ ํ•œ ๊ฐ€์ง€ ์ด์œ ๋กœ ์•„์ง ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ˜„์žฌ ๋…ธ๋“œ ๊ตฌํ˜„์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ๋‚ด๋ถ€๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  v14์—์„œ ์•ฝ์† ๊ฑฐ๋ถ€ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ˜„์žฌ ์žˆ๋Š” ๋…ธ๋“œ ๋ฒ„์ „์„ ๊ฐ์ง€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ ๋…ธ๋“œ๋Š” ๋ฆฌ์Šค๋„ˆ ๋ฐฐ์—ด์„ ํ™•์ธํ•˜๊ณ  ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์ด ๊ฐ์ง€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฆฌ์Šค๋„ˆ์—์„œ ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - https://github.com/nodejs /node/blob/7cf6f9e964aa00772965391c23acda6d71972a9a/lib/internal/process/promises.js#L163 -L216

๋ธŒ๋ผ์šฐ์ € ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :+1:

Node์˜ ๊ฒฝ์šฐ Sentry์—์„œ ๋กœ๊ทธ์ธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์Šค์Šค๋กœ ํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์ž˜๋ชปํ•˜๊ณ  ์ผ๋ถ€๋Š” ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ์ง€์กฐ์ฐจ ๊นจ๋‹ซ์ง€ ๋ชปํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ฒ˜๋Ÿผ ์ƒ์‚ฐ ๋ฒ„๊ทธ์— ๋ฌผ๋ ธ๋‹ค. ์ข‹์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด ์•„๋‹™๋‹ˆ๋‹ค ...

@thomas-darling ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋…ธ๋“œ์˜ ์ฝ”๋“œ ์•ˆ์— ์žˆ๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์žฌํ˜„ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฌธ์„œ ๋งจ ์œ„์—๋Š” ๊ธฐ๋ณธ ์ฝ˜์†” ๋กœ๊น…์„ ์–ป๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ๋งค์šฐ ๋ˆˆ์— ๋„๋Š” ๋ฉ”๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://docs.sentry.io/platforms/node/

image

๋…ธ๋“œ ๋™์ž‘์„ ๋ณต์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ž ์žฌ์ ์ธ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋…ธ๋“œ ๋™์ž‘์„ ๋ณต์ œํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ตœ์†Œํ•œ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์–ต์ œ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถฉ๋Œ์‹œํ‚ค๋Š” ๋‹ค์Œ ๋ฒ„์ „์˜ ๋…ธ๋“œ์—์„œ ๋”์šฑ ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ Sentry๊ฐ€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋…ธ๋“œ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๋™์ž‘์— ์˜์กดํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜์ค‘์— Sentry๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ‘์ž๊ธฐ ๊ณ„์†๋˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ๋ถˆ์พŒํ•œ ์ƒํ™ฉ์— ์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๋ฐ์ดํ„ฐ ์†์‹ค์ด๋‚˜ ๊ธฐํƒ€ ์žฌํ•ด๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Node.js์˜ ๋ฐฉ๋ฒ• ๋ณต์ œ
  2. ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ console.error ์“ฐ๊ธฐ
  3. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์—†๋„๋ก ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜์‹ญ์‹œ์˜ค.

1๋ฒˆ์ด๋‚˜ 2๋ฒˆ ๋‘˜ ๋‹ค ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์•„์š”. ๊ณ ๊ฐ์ด ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ ˆ๋Œ€ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์€ ์˜ต์…˜ 3์ž…๋‹ˆ๋‹ค. ๊ณ ๊ฐ์€ ์˜ค๋ฅ˜๋ฅผ ๋ณด์ง€ ๋ชปํ•˜๊ณ  Sentry๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์‚ฐ์— ํˆฌ์ž…ํ•ฉ๋‹ˆ๋‹ค(์˜ค, ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜ ๋ณด๊ณ  ๋„๊ตฌ์˜ ์•„์ด๋Ÿฌ๋‹ˆ). ์ด๊ฒƒ์€ ํ˜„์žฌ ๋™์ž‘์ด๋ฉฐ ์‹ค์ œ๋กœ ์ค‘์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! Sentry๋Š” ์˜ค๋ฅ˜๋ฅผ ๋” ์•…ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜๋ฅผ ์žก๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ 2๋ฅผ ์„ ํƒํ•˜๋”๋ผ๋„ ์ตœ์†Œํ•œ ๊ฐœ๋ฐœ์ž๋Š” ๊ฑฐ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋™์ž‘(์˜ˆ: ์ถฉ๋Œ)์„ ์›ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์ ˆ์ด ์žˆ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์กฐ์ฐจ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„, ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ณ„๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/getsentry/sentry-javascript/pull/2312
์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋˜‘๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ์œ ํ•œ ์ฝœ๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

```js
Sentry.init({
ํ†ตํ•ฉ: [
์ƒˆ๋กœ์šด Sentry.Integrations.OnUnhandledRejection({
๋ชจ๋“œ: '์—†์Œ'
})
]
});

process.on('์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€', (์ด์œ ) => {
// ์ฝœ๋ฐฑ
})

๋‚˜์—๊ฒŒ ๊ฒฐ๊ณผ๋Š” TypeError: undefined is not a constructor ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ @sentry/react-native ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Btw ํ•ด๋‹น ํŒจํ‚ค์ง€์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@schhumannd @sentry/react-native ๋Š” @sentry/node ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ํ†ตํ•ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด sentry/browser๋ฅผ ๋ฆด๋ฆฌ์Šคํ•œ ํ›„ ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํ•ธ๋“ค๋Ÿฌ์—์„œ true ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ณ€๊ฒฝ์€ ๊ธฐ๋ณธ์ ์ด๋ฉฐ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Œ).

@kamilogorek ์ž˜์ƒ๊น€ ๐Ÿ‘

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด ๋ฆด๋ฆฌ์Šค๋˜๋ฉด ์—ฌ๊ธฐ์—์„œ pingํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@OliverJash ํ•‘ :)

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด: Node์˜ --unhandled-rejections=strict ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Node๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€๋ฅผ ์˜ˆ์™ธ๋กœ ๋ฐœ์ƒ์‹œํ‚จ ๋‹ค์Œ Sentry๊ฐ€ ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ๋ณด๊ณ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

--unhandled-rejections=strict ํ™œ์„ฑํ™”๋ฅผ ์‹œ๋„ํ–ˆ์„ ๋•Œ OnUnhandledRejections ํ†ตํ•ฉ์ด ํšจ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋ฌธ์„œ PR์€ ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค https://github.com/getsentry/sentry-docs/pull/1351/

@OliverJAsh ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ cli ํ”Œ๋ž˜๊ทธ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ํ–‰๋™์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์€ OnUnhandledRejection ํ†ตํ•ฉ์— cli ํ”Œ๋ž˜๊ทธ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Sentry.init({
  integrations: [
    new Sentry.Integrations.OnUnhandledRejection({
      mode: 'none'
    })
  ]
});

--unhandled-rejection=none ์™€ (๊ฐœ๋…์ ์œผ๋กœ) ๋™์ผํ•˜๊ณ  warn ๋ฐ strict ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
warn (ํ˜„์žฌ ๊ธฐ๋ณธ๊ฐ’)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๊ณ  ๋ฐ ์˜ค๋ฅ˜ ์ž์ฒด๋ฅผ ๊ธฐ๋กํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๋Š” ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
strict ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์บก์ฒ˜ํ•˜๊ณ  ํ”Œ๋Ÿฌ์‹œํ•˜๊ณ (์ „๋‹ฌ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ) ์ข…๋ฃŒ ์ฝ”๋“œ 1๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉ์ด ๋…ธ๋“œ ํ”Œ๋ž˜๊ทธ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…ธ๋“œ ํ”Œ๋ž˜๊ทธ์™€ ๊ด€๋ จํ•˜์—ฌ Sentry๊ฐ€ (์ด ํ†ตํ•ฉ ์™ธ๋ถ€์—์„œ) ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด: Node์˜ --unhandled-rejections=strict ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Node๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€๋ฅผ ์˜ˆ์™ธ๋กœ ๋ฐœ์ƒ์‹œํ‚จ ๋‹ค์Œ Sentry๊ฐ€ ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ๋ณด๊ณ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@schhumannd ์ฐธ๊ณ ๋กœ, ์˜ค๋Š˜ ์•„์นจ์— ์šฐ๋ฆฌ๋Š” @sentry/react-native 1.10.0 [EDIT: whoops, should be 1.1.0 ]๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” @sentry/browser ์˜ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค(๋ฐ˜ํ™˜ ํฌํ•จ - true -๋Œ€์‹ - false ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ˆ˜์ •).

@lobsterkatie @sentry/react-native์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋Š” 1.3.7 ์ธ

๋”ฐ๋ผ์„œ 1.10.0์„ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@schhumannd @lobsterkatie ๋Š” 1.1.0 ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. 5.9.0 of @sentry/browser ์—…๋ฐ์ดํŠธํ–ˆ์„ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋กœ๊น… ์ˆ˜์ค€์„ ์„ค์ •ํ•˜๋Š” ์ฒ˜๋ฆฌ๊ธฐ ์˜ต์…˜์€ ์ตœ์‹  ๋ฒ„์ „์˜ @sentry/react-native ์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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