@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
}
์ด๋ฒคํธ ์ธ์คํด์ค์ฒ๋ผ ๋ณด์ ๋๋ค. ์ ํ๋ ์ ๋ณด๋ก๏ผ์ด ๋ฒ๊ทธ๊ฐ ์ด๋์ ๋ฐ์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค๏ผ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ฌ๋์ด ์์ต๋๊น?
์ฐ๋ฆฌ๋ ๋ํ ์ง๋ ๋ช ์ฃผ ๋์ ์ด๊ฒ๋ค์ ๋ณด๊ธฐ ์์ํ์ต๋๋ค. ๋ฐฉ๊ธ ์กฐ์ฌํ๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์ ์์ธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์์ต๋๋ค.
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
๋ถํํ๋ ๋ ๋ง์ ์ ํ์ ์
๋ ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง๋ค ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ ๊ณผ์ ์ ๋ํ ํผ๋๋ฐฑ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์ ์์ ๋ฐ์ ์ ์์ต๋๋ค.
(๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๋ํ๋ฅผ ๊ณต๊ฐํ๊ธฐ ์ํด ๊ทํ์ ์ด๋ฉ์ผ ๋์ ์ฌ๊ธฐ์ ๋ต๋ณ์ ๋๋ ธ์ต๋๋ค.)
๋ด ๊ด์ฐฐ์์ :
ZXing
๋ฐ browser-image-compression
์ ๊ฐ์ ๋ช ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์น ์ฑ์ ์ค์น๋์ด ์์ง๋ง ํ์ฌ ์ถ์ ์คํฌ๋ฆฝํธ๋ ์์ต๋๋ค.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
์ฌ์ฉํ๋ ํ์ด์ง์์๋ง ํ์๋๋ ์ด์ ์
๋๋ค. ๊ทธ๋ค์ ๋น์ ์ด ์ฌ๊ธฐ์ ์ค๋ช
ํ๋ ๊ฒ์ ์ ํํ ํ๊ณ ์์ต๋๋ค
๊ฐ์ฌํฉ๋๋ค!!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์ค๋ฅ๋ก ์ธํด ํ ๋น๋ ์ฉ๋์ด ์์ง๋์์ต๋๋ค.