Sentry-javascript: ์ด๋ฒคํŠธ: currentTarget, isTrusted, target, type ํ‚ค๋กœ ์บก์ฒ˜๋œ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์•ฝ์† ๊ฑฐ๋ถ€

์— ๋งŒ๋“  2020๋…„ 04์›” 20์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: getsentry/sentry-javascript

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

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

๋ฒ„์ „:

5.10.2

์„ค๋ช…

๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ์œ ์šฉํ•œ ์ •๋ณด ์—†์ด currentTarget, isTrusted, target, type ํ‚ค๋กœ ์บก์ฒ˜๋œ Event Non-Error Promise Rejection๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ์ž์ฃผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋Š”

__serialized__ = {
    currentTarget: [object Null], 
    isTrusted: [Circular ~], 
    target: head > script[type="text/javascript"], 
    type: error
}

์ด๋ฒคํŠธ ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ •๋ณด๋กœ๏ผŒ์ด ๋ฒ„๊ทธ๊ฐ€ ์–ด๋””์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค๏ผŒ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Needs Information

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

์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ• ๋‹น๋Ÿ‰ ์šฉ๋Ÿ‰์ด ์†Œ์ง„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ง€๋‚œ ๋ช‡ ์ฃผ ๋™์•ˆ ์ด๊ฒƒ๋“ค์„ ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›์ธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—†์Šต๋‹ˆ๋‹ค.

Sentry v5.15.5์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ Sentry์—์„œ ์บก์ฒ˜ํ•œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(์ด ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋œ target ์ฃผ๋ชฉํ•˜์„ธ์š”)

@kamilogorek ํšŒ์‚ฌ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๋ฒคํŠธ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์˜ˆ์ œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด @kamilogorek ๋„

@sheelah ๋„ค, ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@sheelah ์†”์งํžˆ ๋งํ•˜๋ฉด ์—ฌ๊ธฐ์„œ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JS๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์ œ๊ณตํ•˜๋Š” ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Promise ๊ฐœ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฑฐ๋ถ€๋  ๋•Œ๋งˆ๋‹ค onunhandledrejection ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค(OP ์„ค๋ช…์˜ onerror ๋งˆ์ฐฌ๊ฐ€์ง€).

https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event

๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฑฐ๊ธฐ์— ์ž„์˜์˜ ๋ฌผ๊ฑด์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ Promise.reject("whatever") ๋˜๋Š” Promise.reject(jQueryBecauseWhyNot) ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์™„์ „ํžˆ ์œ ํšจํ•œ JS ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์›์‹œ ๊ฐ’์ด ์•„๋‹Œ ๊ฒƒ, ์Šคํƒ ์ถ”์ ์„ ํฌํ•จํ•˜๋Š” ๊ฐœ์ฒด(์˜ˆ: Error ) ๋˜๋Š” ๋‚ด๋ถ€ DOM ์˜ˆ์™ธ๋ฅผ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ๊ฐ„๋‹จํ•œ ๊ฐœ์ฒด ์ง๋ ฌํ™”๋กœ ๋Œ์•„๊ฐ€์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌ๋œ ์ด "์ž„์˜์˜ ๊ฐ’"์ด ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ ๋ชฉ๋ก์€ eventbuilder.ts ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€“ https://github.com/getsentry/sentry-javascript/blob/master/packages/ ๋ธŒ๋ผ์šฐ์ € /src/eventbuilder.ts#L17 -L80

๋ถˆํ–‰ํžˆ๋„ ๋” ๋งŽ์€ ์œ ํ˜•์˜ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ ๊ณผ์ •์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ œ์•ˆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋Œ€ํ™”๋ฅผ ๊ณต๊ฐœํ•˜๊ธฐ ์œ„ํ•ด ๊ท€ํ•˜์˜ ์ด๋ฉ”์ผ ๋Œ€์‹  ์—ฌ๊ธฐ์— ๋‹ต๋ณ€์„ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.)

๋‚ด ๊ด€์ฐฐ์—์„œ :

  • ๋ชจ๋ฐ”์ผ ๋˜๋Š” ๋ฐ์Šคํฌํƒ‘์˜ ๋‹ค์–‘ํ•œ ์ตœ์‹  Safari ๋ฒ„์ „์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ZXing ๋ฐ browser-image-compression ์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์›น ์•ฑ์— ์„ค์น˜๋˜์–ด ์žˆ์ง€๋งŒ ํƒ€์‚ฌ ์ถ”์  ์Šคํฌ๋ฆฝํŠธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • API ํ˜ธ์ถœ์ด ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜(์ฝ”๋“œ 0)์™€ ํ•จ๊ป˜ ์‹คํŒจํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ์‹œ๊ฐ„์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ์ œ ๊ฒฝ์šฐ์—๋Š” ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ProgressEvent ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ HTTP ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ €๋Š” axios๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).
ADDITIONAL DATA

__serialized__ | {
    currentTarget: [object Null],
    isTrusted: [Circular ~],
    target: [object FileReader],
    type: error}
-- | --

๋˜ํ•œ ๋ฐฉ๊ธˆ "๊ฐ’: null๋กœ ์บก์ฒ˜๋œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ์•ฝ์† ๊ฑฐ๋ถ€"๋ผ๋Š” ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ @anton-bot๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ Mac OS X 10.15.6์—์„œ Safari 13.1.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

reject( ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋œ ์•ฑ ์ฝ”๋“œ์—์„œ null ๊ฐœ์ฒด๊ฐ€ ์ œ๊ณต๋˜์—ˆ์ง€๋งŒ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์„ธ ๋ฒˆ์งธ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŒŒํ‹ฐ ์Šคํฌ๋ฆฝํŠธ. ์Šคํƒ ์ถ”์ ์ด๋‚˜ ์ด๋™ ๊ฒฝ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ง€๋‚œ 2์ฃผ ๋™์•ˆ ์ด๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์‚ฌ์ดํŠธ์—์„œ๋Š” google maps javascript API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ๋งŒ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด Google ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” URL์—์„œ ์ด๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: ์ง€๊ธˆ๊นŒ์ง€ iOS ๋ฐ Android์—์„œ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ:

{
  currentTarget: [object Null], 
  isTrusted: [Circular ~], 
  target: head > script[type="text/javascript"], 
  type: error
}

@asbjornh ์•„๋‹ˆ์š” ๋‚ด ํŽ˜์ด์ง€์— Google ์ง€๋„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@kamilogorek OP์˜ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ(๋ฐ ๋‚ด)๊ฐ€ ์ด์™€ ๊ฐ™์€ Promise.reject(new Event("error")) ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด ์ƒํ™ฉ์— ๋Œ€ํ•œ Sentry ์ด๋ฒคํŠธ์— ํ•ญ์ƒ ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

- ์˜ˆ @asbjornh, ๊ทธ ๋‹ค์Œ์ด ํ๋ฆ„์„ ํ†ตํ•ด ๊ฐˆ ๊ฒƒ https://github.com/getsentry/sentry-javascript/blob/caff9e7b308f99f04443d57d990c252a51a153bf/packages/browser/src/eventbuilder.ts#L97 -L107

๋‚˜๋Š” ๋˜ํ•œ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ• ๋‹น๋Ÿ‰ ์šฉ๋Ÿ‰์ด ์†Œ์ง„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ 24์‹œ๊ฐ„ ๋™์•ˆ 289๊ฐœ์˜ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ํŽ˜์ด์ง€๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

{
currentTarget: [object Null], 
isTrusted: [Circular ~], 
target: head > link, 
type: error
}

์šฐ๋ฆฌ๋Š” next.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ cra์™€ ๋™์ผ ๐Ÿ˜‚

์ด ๋ฌธ์ œ์˜ ์›์ธ์€ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = src;
  script.onload = resolve;
  script.onerror = reject;
  document.body.appendChild(script);
});

onerror ํ›„ํฌ๋Š” ์‹ค์ œ๋กœ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” Error ์ธ์Šคํ„ด์Šค ๋Œ€์‹  Event ๊ฐœ์ฒด๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ https://developer.mozilla.org/de/docs/Web/API/HTMLScriptElement ์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ Event ๋ฅผ Error ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = src;
  script.onload = resolve;
  script.onerror = event => {
    reject(new Error(`Failed to load ${event.target.src}`));
  };
  document.body.appendChild(script);
});

์ œ ๊ฒฝ์šฐ์—๋Š” ๋ˆ„๊ตฐ๊ฐ€ ๋น„์Šทํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ Firefox์—์„œ ์ด๋ฅผ ์ผ์œผํ‚ค๋Š” Next.js์˜ 9.5.2 ํ”„๋ฆฌํŽ˜์นญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. (์—ฌ๊ธฐ๊ฐ€ ์•„๋‹๊นŒ์š”? https://github.com/getsentry/sentry-javascript/issues/2546#issuecomment-697771381) ์ด๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค: https://github.com/vercel/next.js/pull/16757 9.5.3 ๋˜๋Š” Canary๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

์˜ค๋ฅ˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ›จ์”ฌ ๋” ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.

Uncaught (in promise) 
error
bubbles: false
...
...
as: "fetch"
assignedSlot: null
attributes: NamedNodeMap(3
0: href="/_next/data/wmQYPCwvbuBulJfEwTMRf/smartwatches/fitbit-ionic.json"
1: rel="prefetch"
2: as="fetch"
as: as="fetch"
href: href="/_next/data/wmQYPCwvbuBulJfEwTMRf/smartwatches/fitbit-ionic.json"
length: 3
rel: rel="prefetch"
...
...
โ€‹
isTrusted: true
originalTarget: <link href="/_next/data/wmQYPCwvbuBuโ€ฆtches/fitbit-ionic.json" rel="prefetch" as="fetch">
returnValue: true
srcElement: <link href="/_next/data/wmQYPCwvbuBuโ€ฆtches/fitbit-ionic.json" rel="prefetch" as="fetch">โ€‹
target: <link href="/_next/data/wmQYPCwvbuBuโ€ฆtches/fitbit-ionic.json" rel="prefetch" as="fetch">
timeStmp: 25366
type: "error"
...

Sentry๊ฐ€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@Turbo87 ๋„ค! ์ด๊ฒƒ์ด ๋ฐ”๋กœ @googlemaps/js-api-loader ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ๋งŒ ํ‘œ์‹œ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹น์‹ ์ด ์—ฌ๊ธฐ์— ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

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