Sentry-javascript: [object ErrorEvent]둜 기둝 된 였λ₯˜ λ©”μ‹œμ§€ 속성

에 λ§Œλ“  2017λ…„ 08μ›” 07일  Β·  31μ½”λ©˜νŠΈ  Β·  좜처: getsentry/sentry-javascript

κΈ°λŠ₯ 을 μš”μ²­ν•˜κ±°λ‚˜ 버그λ₯Όλ³΄κ³  ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?
κ³€μΆ©.

ν˜„μž¬ 행동은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?
λ•Œλ•Œλ‘œ (항상은 μ•„λ‹˜) 였λ₯˜μ˜ message 속성이 [object ErrorEvent] 둜 κΈ°λ‘λ©λ‹ˆλ‹€. https://docs.sentry.io/clients/javascript/integrations/angular/에 μ„€λͺ… λœλŒ€λ‘œ Angularμ—μ„œ Raven의 ν‘œμ€€ κ΅¬ν˜„μ„ λ”°λžμŠ΅λ‹ˆλ‹€

μ˜ˆμƒλ˜λŠ” λ™μž‘μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?
정상적인 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 보렀면.

레이븐 3.17.0
각도 4.3.1
Webpack λΉŒλ“œ
CLIλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
CDN 버전

objecterrorevent

Help Wanted Needs Reproduction Bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. ErrorEvent λŠ” μ—¬κΈ° μ—μ„œ 찾을 μˆ˜μžˆλŠ” isError util ν•¨μˆ˜μ— μ˜ν•΄ 였λ₯˜λ‘œ μ²˜λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 편의λ₯Ό μœ„ν•΄ ν•¨μˆ˜ μ •μ˜λ„ λΆ™μ—¬ λ„£κ² μŠ΅λ‹ˆλ‹€.

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

이 ν•¨μˆ˜κ°€ ErrorEvent λŒ€ν•΄ trueλ₯Ό λ°˜ν™˜ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ μ½˜μ†”μ—μ„œ λΉ λ₯Έ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν–ˆμ§€λ§Œ μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.

image

isError λŠ” captureException λ©”μ„œλ“œμ—μ„œ μ˜ˆμ™Έ 맀개 λ³€μˆ˜κ°€ 였λ₯˜μΈμ§€ μ•„λ‹ˆλ©΄ λ‹¨μˆœνžˆ λ©”μ‹œμ§€μΈμ§€λ₯Ό κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. captureException λŠ” μ˜ˆμ™Έκ°€ _ μ‹€μ œλ‘œ _ 였λ₯˜κ°€ μ•„λ‹ˆλΌκ³  μƒκ°ν•˜λŠ” 경우 captureMessage μ‚¬μš©ν•˜μ—¬ λŒ€μ‹œ λ³΄λ“œμ— μ˜ˆμ™Έλ₯Ό λ³΄λƒ…λ‹ˆλ‹€. 이 경우 Raven은 μŠ€νƒ 좔적을 κ³„μ‚°ν•˜κ±°λ‚˜ μ˜ˆμ™Έλ₯Ό "처리"ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλƒ₯ κ·ΈλŒ€λ‘œ λ³΄λƒ…λ‹ˆλ‹€.

ErrorEvent κ°œμ²΄μ— λŒ€ν•΄ trueλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ isError λ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€ μ•Šμ•„μ•Όν•˜λŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  31 λŒ“κΈ€

Angular λ¬Έμ„œ μ–΄λ”˜κ°€μ— ErrorEvent 의 μ •μ˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ? λΆ„λͺ…νžˆ 이것은 Error λ₯Ό μ˜¬λ°”λ₯Έ λ°©λ²•μœΌλ‘œ "상속"ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€.

λ¬Έμ œλŠ” TraceKit의 traceKitWindowOnError() λ©”μ„œλ“œμ—μžˆμ„ 수 μžˆμ§€λ§Œ message μΈμˆ˜κ°€ ErrorEvent 일 수 μžˆλ‹€λŠ” 점을 κ³ λ €ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ ( MDN λ¬Έμ„œ μ°Έμ‘°).

@benvinegar μ—¬κΈ° ErrorEvent 에 λͺ‡ 가지 λ¬Έμ„œκ°€ μžˆμŠ΅λ‹ˆλ‹€ : https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent

μ΄κ²ƒμ˜ 영ν–₯μ„λ°›λŠ” μ‚¬μš©μžλ„ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
https://forum.sentry.io/t/reporting-object-errorevent/1807

[email protected] (κ·ΈλŸ¬λ‚˜ 이전 λ²„μ „μ—μ„œλ„ ν•œλ™μ•ˆ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€)
각도 4.x
CLI μ‚¬μš©

Ionic 3 및 [email protected] κ³Ό λ™μΌν•©λ‹ˆλ‹€.

<script>
  undefined.foo();
</script>

^ 이것은 λ‹Ήμ‹ μ˜ htmlμ—μ„œ [object ErrorEvent] 둜 μ„ΌνŠΈλ¦¬λ₯Ό 톡해 safari에 λ‘œκ·ΈμΈλ©λ‹ˆλ‹€. μ˜¬λ°”λ₯Έ λ©”μ‹œμ§€λŠ” TypeError: undefined is not an object (evaluating 'undefined.foo') μž…λ‹ˆλ‹€.

iframe 생성을 μ‹œλ„ν•˜λŠ” 슀크립트 νƒœκ·Έλ₯Ό 톡해 μ½”λ“œλ₯Ό μ‚½μž…ν•˜λŠ” μ™ΈλΆ€ μŠ€ν¬λ¦½νŠΈκ°€ μžˆμ§€λ§Œ μ‚¬νŒŒλ¦¬μ— μ˜ν•΄ μ°¨λ‹¨λ©λ‹ˆλ‹€. μ‚½μž… 된 슀크립트 νƒœκ·Έμ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ―€λ‘œ μ„ΌνŠΈλ¦¬λŠ” [object ErrorEvent] λ§Œλ³΄κ³ ν•©λ‹ˆλ‹€.

[object Event] 둜보고 된 μ„ΌνŠΈλ¦¬μ˜ 또 λ‹€λ₯Έ 였λ₯˜λŠ” flowplayerμ—μ„œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. FlowplayerλŠ”

jQueryElement.trigger('error', [api, {code: 5}]);

jQueryλ₯Ό μž„λ² λ”©ν•˜μ—¬ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$('div:first').trigger('error')

μ„ΌνŠΈλ¦¬λŠ” 이런 κ±Έ λ³Έλ‹€
image

λ¬Όλ‘  맀우 μ§λ ¬ν™”ν•˜μ§€ 그게 μ „λΆ€μ§€λ§Œ, 같은 였λ₯˜ error on element from jQuery - context <div class="foo><div class="bar" ... 훨씬 더 도움이 λ‹€μŒμ΄ 될 κ²ƒμž…λ‹ˆλ‹€ [object Event]

μ΄κ²ƒμ˜ 영ν–₯λ„λ°›μŠ΅λ‹ˆλ‹€.

@daangeerdink @jdelaune @rosslavery @tgensol λˆ„κ΅°κ°€κ°€ 이것을 μž¬ν˜„ν•˜λŠ” 데 도움이 될 μˆ˜μžˆλŠ” κ°€μž₯ μž‘μ€ μ½”λ“œλ₯Ό 제곡 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@sod 방금 ν™•μΈν–ˆκ³  Safari 10.1.2λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ ν•œ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ μ˜¬λ°”λ₯Έ λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

screen shot 2017-09-18 at 14 42 47

였λ₯˜κ°€ λ„ˆλ¬΄ 뢈투λͺ…ν•΄μ„œ μ½”λ“œλ² μ΄μŠ€μ˜ μ–΄λŠ λΆ€λΆ„μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ”μ§€ 식별 ν•  수 μ—†κΈ° λ•Œλ¬Έμ— 개인적으둜 μž¬ν˜„μ„ 제곡 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μž‘μ—… ν•  μŠ€νƒ 좔적도없고 λ‚΄ μ½”λ“œμΈμ§€ 타사 λΌμ΄λΈŒλŸ¬λ¦¬μΈμ§€ ν™•μΈν•˜λŠ” 였λ₯˜ λ©”μ‹œμ§€λ„ μ—†μŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ μ‚¬λžŒμ΄ 제곡 ν•  μˆ˜μžˆλŠ” κ°„λ‹¨ν•œ μ˜ˆκ°€ 있기λ₯Ό λ°”λžλ‹ˆλ‹€. 더 이상 λ„μ›€μ΄λ˜μ§€ λͺ»ν•΄ μ£„μ†‘ν•©λ‹ˆλ‹€.

μš°λ¦¬λ„μ΄ 문제λ₯Ό κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. μ§€λ‚œ 10 일 λ™μ•ˆμ˜ 일뢀 데이터λ₯Ό 곡유 ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (이 μœ ν˜•μ˜ 이벀트 22,000 개, μ‚¬μš©μž 13,000 개). λ‚˜λŠ” 그것이 당신이 그것을 μž¬ν˜„ν•˜λŠ” 데 λ„μ›€μ΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.
image

image

image

@kamilogorek 이 μœ ν˜•μ˜ 였λ₯˜λŠ” 2 백만 κ°œμž…λ‹ˆλ‹€. 문제라고 μƒκ°ν–ˆμ§€λ§Œ μ œλŒ€λ‘œ 좔적 ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. ErrorEvent λŠ” μ—¬κΈ° μ—μ„œ 찾을 μˆ˜μžˆλŠ” isError util ν•¨μˆ˜μ— μ˜ν•΄ 였λ₯˜λ‘œ μ²˜λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 편의λ₯Ό μœ„ν•΄ ν•¨μˆ˜ μ •μ˜λ„ λΆ™μ—¬ λ„£κ² μŠ΅λ‹ˆλ‹€.

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

이 ν•¨μˆ˜κ°€ ErrorEvent λŒ€ν•΄ trueλ₯Ό λ°˜ν™˜ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ μ½˜μ†”μ—μ„œ λΉ λ₯Έ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν–ˆμ§€λ§Œ μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.

image

isError λŠ” captureException λ©”μ„œλ“œμ—μ„œ μ˜ˆμ™Έ 맀개 λ³€μˆ˜κ°€ 였λ₯˜μΈμ§€ μ•„λ‹ˆλ©΄ λ‹¨μˆœνžˆ λ©”μ‹œμ§€μΈμ§€λ₯Ό κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. captureException λŠ” μ˜ˆμ™Έκ°€ _ μ‹€μ œλ‘œ _ 였λ₯˜κ°€ μ•„λ‹ˆλΌκ³  μƒκ°ν•˜λŠ” 경우 captureMessage μ‚¬μš©ν•˜μ—¬ λŒ€μ‹œ λ³΄λ“œμ— μ˜ˆμ™Έλ₯Ό λ³΄λƒ…λ‹ˆλ‹€. 이 경우 Raven은 μŠ€νƒ 좔적을 κ³„μ‚°ν•˜κ±°λ‚˜ μ˜ˆμ™Έλ₯Ό "처리"ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλƒ₯ κ·ΈλŒ€λ‘œ λ³΄λƒ…λ‹ˆλ‹€.

ErrorEvent κ°œμ²΄μ— λŒ€ν•΄ trueλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ isError λ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€ μ•Šμ•„μ•Όν•˜λŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

ErrorEvent 객체에 λŒ€ν•΄ trueλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ isErrorλ₯Ό μ—…λ°μ΄νŠΈν•˜μ§€ μ•Šμ•„μ•Όν•˜λŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

예. μ‹€μ œλ‘œ Error 의 ν•˜μœ„ ν•­λͺ©μ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ ( Event 의 ν•˜μœ„ ν•­λͺ©). 예λ₯Ό λ“€μ–΄ stack 속성이 μ—†μŠ΅λ‹ˆλ‹€ (AFAICT, μ½˜μ†”μ—μ„œ 놀기). μ΄λŠ” μ‹€μ œλ‘œ μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬λ˜μ§€ μ•Šμ„ 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

이 였λ₯˜κ°€ μ‹€μ‹œκ°„μœΌλ‘œ μƒμ„±λ˜λŠ” λ°©λ²•μ˜ 예λ₯Ό ν™•μΈν•˜μ—¬μ΄λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ°€μž₯ 쒋은 방법을 νŒŒμ•…ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

ErrorEvent 의 μƒμ„±μžλŠ” Error λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ λ‹€μŒκ³Ό 같이 μ‰½κ²Œ 처리 ν•  수 β€‹β€‹μžˆμŠ΅λ‹ˆλ‹€.

if (isErrorEvent(ex)) {
    ex = ex.error;
}

μ—¬κΈ° μ—μ„œ ꡬ성 μ •μ˜λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 특히 ErrorEventInit ν•΄μ‹œλ₯Όλ³΄μ‹­μ‹œμ˜€. 선택적 맀개 λ³€μˆ˜μ΄λ―€λ‘œ μœ„μ— κ²Œμ‹œ ν•œ μ†”λ£¨μ…˜μ΄ ErrorEvent.error κ°€ μ •μ˜λ˜μ§€ μ•Šμ€ 경우λ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ¬Όλ‘ ,이 λ¬Έμ œκ°€ ν•΄κ²° 될 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. isError λ₯Ό μΆ”κ°€ν•˜μ—¬ true λ₯Ό λ°˜ν™˜ν•˜λŠ” κ²ƒλ§Œ 큼 κ°„λ‹¨ν•˜μ§€ μ•Šλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

이해 ν–ˆμ–΄μš”. λͺ‡ λΆ„ 후에 PR을 올릴 κ²Œμš”.

3.19.x μ—μ„œ μˆ˜μ • 됨

κ°μ‚¬ν•©λ‹ˆλ‹€ @shcallaway! πŸ‘

3.19.1 πŸ€”μ—μ„œ μ—¬μ „νžˆμ΄ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
image
image

@PhilippSpo 이 μ΄λ²€νŠΈλŠ” μ–΄λ–€ λΈŒλΌμš°μ €μ—μ„œ λ°œμƒν•©λ‹ˆκΉŒ? ErrorEvent λŠ” 일뢀 였래된 λͺ¨λ°”일 λΈŒλΌμš°μ € 및 IEμ—μ„œ μ§€μ›λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 일반 μ†”λ£¨μ…˜μœΌλ‘œ λŒ€μ²΄ν•΄μ•Όν–ˆμŠ΅λ‹ˆλ‹€.

@kamilogorek 크둬 61.0.3163

Chrome 61μ—μ„œλ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. πŸ˜• 곧 쑰사해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€ @shcallaway

Safari 11.0, Mac OS 10.13μ—μ„œλ„ λ°œμƒν•©λ‹ˆλ‹€.

'message'맀개 λ³€μˆ˜κ°€ ErrorEvent 객체 인 경우 traceKitWindowOnError κ°€ μž…λ ₯ 맀개 λ³€μˆ˜λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
screen shot 2017-11-06 at 11 36 34
그리고 'ex'λŠ” μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ 'message'ν•„λ“œκ°€ λ¬Έμžμ—΄μ΄ μ•„λ‹Œ ErrorEvent 인 객체둜 notifyHandlersλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
screen shot 2017-11-06 at 11 41 14
_makeRequestμ—μ„œ 계측화 되면 μ˜λ―Έμ—†λŠ” λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

@ michal-rumanek을 쑰사해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.이 문제λ₯Ό 곧 μ²˜λ¦¬ν•˜λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€ (이번 μ£Όμ—λŠ” μ—¬μœ  μ‹œκ°„ μ—†μŒ).

@kamilogorek , 진행 상황이 μžˆμŠ΅λ‹ˆκΉŒ? ;-)

μ•ˆλ…•ν•˜μ„Έμš”, [object Object] 였λ₯˜κ°€ 많이 λ°œμƒν•©λ‹ˆλ‹€.
screenshot 2017-12-01 09 41 20

각도 4
Chrome 62.0.3202
Raven-js 3.20.1

https://github.com/getsentry/raven-js/pull/1162 μ—μ„œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰