Sentry-javascript: κ°œλ°œμ„ μœ„ν•΄ λΉ„ν™œμ„±ν™”

에 λ§Œλ“  2013λ…„ 05μ›” 03일  Β·  19μ½”λ©˜νŠΈ  Β·  좜처: getsentry/sentry-javascript

Raven을 AMD 쒅속 ν•­λͺ©μœΌλ‘œ ν¬ν•¨μ‹œν‚¨ ν›„ window.onerror 이벀트λ₯Ό λ³΅μ›ν•˜λŠ” 방법을 μ°ΎλŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

개발 μ€‘μ—λŠ” Raven을 μ „ν˜€ μ‚¬μš©ν•˜κ³  싢지 μ•ŠμœΌλ―€λ‘œ ν”„λ‘œλ•μ…˜ λͺ¨λ“œμ—μ„œλŠ” config() / install() 만 ν˜ΈμΆœν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 개발 λͺ¨λ“œμ—μ„œ λͺ¨λ“  였λ₯˜λŠ” μ—¬μ „νžˆ TraceKit.report() 에 μ˜ν•΄ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŠ” λΈŒλΌμš°μ € 개발 λ„κ΅¬μ—μ„œ 파일/라인 번호/μŠ€νƒ 좔적이 더 이상 도움이 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μƒλ‹Ήνžˆ μ‹€λ§μŠ€λŸ½μŠ΅λ‹ˆλ‹€.

개발자 λͺ¨λ“œμ—μ„œ uninstall() λ₯Ό ν˜ΈμΆœν–ˆμ§€λ§Œ 도움이 λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. config() λ˜λŠ” install() λ‚΄λΆ€μ—μ„œ μˆ˜ν–‰ν•˜λŠ” λŒ€μ‹  window.onerror 에 λ°”μΈλ”©ν•˜λŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

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

아직도 그것을 μ•Œμ•„λ‚΄λ €κ³  μ—¬κΈ° μ˜€λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄, 그것은 λ‚΄κ°€ μ²˜μŒμ— λ†“μΉœ ꡬ성 μ˜΅μ…˜μ΄μ—ˆμŠ΅λ‹ˆλ‹€ shouldSendCallback :

import Raven from 'raven-js';

const env = 'prod';
const release = '12345';

Raven
  .config('https://<example>@sentry.io/1234', {
    environment: env,
    release: release,
    shouldSendCallback: () => {
      // Do your logic here...
      return ['prod', 'staging'].indexOf(env) !== -1;
    },
  })
  .install();

shouldSendCallback κ°€ false $이면 λ³΄μ΄ˆκ°€ λ³΄κ³ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 πŸ‘ λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ— 쑰건뢀 보고 논리가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

해결책을 μ°Ύμ•˜μ§€λ§Œ μ΄μƒμ μ΄μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€...

개발자 λͺ¨λ“œμ—μ„œ μˆ˜λ™μœΌλ‘œ window.onerror = null λ₯Ό μ„€μ •ν•˜λ €κ³  ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” λ‚΄κ°€ require() λͺ‡ 개의 λͺ¨λ“ˆμ—μ„œ Raven을 μ‚¬μš©ν•˜κ³  μžˆμ—ˆκ³  Raven이 window.onerror 에 λ‹€μ‹œ 바인딩될 λ•Œλ§ˆλ‹€μ˜€μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λŒ€μ‹  noConflict() μ‚¬μš©μ„ μ€‘λ‹¨ν•˜κ³  requirejs ꡬ성에 μ „μ—­ μ’…μ†μ„±μœΌλ‘œ ν¬ν•¨ν•˜κ³  λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ 둜컬 μ’…μ†μ„±μœΌλ‘œ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ λ‚˜μ€‘μ— Raven이 이벀트λ₯Ό λ‹€μ‹œ λ°”μΈλ”©ν•˜μ§€ μ•Šκ³ λ„ window.onerror = null λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ½€ μ§€μ €λΆ„ν•œ μˆ˜μ • :(

@adambiggs 또 λ‹€λ₯Έ μ†”λ£¨μ…˜μ€ ꡬ성 및 μ„€μΉ˜ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λŠ” Raven-js용 λž˜ν•‘ AMD λͺ¨λ“ˆμ„ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” raven-jsλ₯Ό ν•œ 번만 κ°€μ Έμ˜¬ 수 μžˆμ§€λ§Œ 자체 λͺ¨λ“ˆμ„ μ—¬λŸ¬ 번 κ°€μ Έμ˜¬ 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€(afaik).

https://github.com/getsentry/raven-js/pull/109 및 https://github.com/getsentry/raven-js/issues/91#issuecomment -15560074와 관련이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 더 이상 관련이 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€. window.onerror λŠ” install() λ₯Ό ν˜ΈμΆœν•  λ•ŒκΉŒμ§€ λ³€κ²½λ˜μ§€ μ•Šκ³  uninstall() λ₯Ό ν˜ΈμΆœν•  λ•Œ λ³΅μ›λ©λ‹ˆλ‹€. λ‹€λ₯Έ λ¬Έμ œκ°€ 있으면 μ•Œλ €μ£Όμ„Έμš”.

@mattrobenolt , 1.1.11둜 μ—…κ·Έλ ˆμ΄λ“œν–ˆκ³  install() λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³  μ—¬μ „νžˆ κΉŒλ§ˆκ·€ 처리 였λ₯˜λ‘œ λλ‚©λ‹ˆλ‹€.

@bobbyrenwick 이런 일이 μΌμ–΄λ‚˜κ³  μžˆμŒμ„ λ³΄μ—¬μ£ΌλŠ” 곡개 μžλ£Œμ— μ €λ₯Ό μ—°κ²°ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

이에 λŒ€ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ? Raven.config() λ˜λŠ” Raven.install() λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ±°λ‚˜ Raven.config(false) λ₯Ό ν˜ΈμΆœν•˜λ”λΌλ„ jquery λ˜λŠ” onerror ν•Έλ“€λŸ¬κ°€ μ—¬μ „νžˆ μ„€μΉ˜λœ 것 κ°™μŠ΅λ‹ˆλ‹€. μœ μΌν•œ ν•΄κ²° 방법은 μ²˜μŒμ— raven jsλ₯Ό λ‘œλ“œν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€(이상적이지 μ•ŠμŒ).

μ°Έμ‘°: #282 :)

#282λ₯Ό 배경으둜 μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? 거기에 μ–΄λ–€ ν•΄κ²° 방법도 보이지 μ•ŠμŠ΅λ‹ˆλ‹€.

λ„€, 아직 해결책이 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ‚΄ μœ μΌν•œ μˆ˜μ •μ€ if λΈ”λ‘μ—μ„œ require() λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(λ‚΄ μ½”λ“œμ˜ λ‚˜λ¨Έμ§€ 뢀뢄은 이제 import λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  μ—…λ°μ΄νŠΈ? μ—¬μ „νžˆ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

νŽΈμ§‘: λ‚΄ λ§νˆ¬μ— λŒ€ν•΄ μ£„μ†‘ν•©λ‹ˆλ‹€. κΈ΄ ν•˜λ£¨λ₯Ό λ³΄λƒˆμŠ΅λ‹ˆλ‹€.

무엇을 ν•˜λ €κ³  ν•©λ‹ˆκΉŒ? λ‚˜λŠ” μ΄κ²ƒμ„ν•˜κ³  μžˆλŠ”λ° 잘 μž‘λ™ν•©λ‹ˆλ‹€.

if (process.env.RAVEN_DSN) {
  require('raven-js').config(process.env.RAVEN_DSN, {
    environment: process.env.NODE_ENV,
  }).install();
}

μ—¬κΈ°μ„œ process.env.RAVEN_DSN λŠ” λ¬Όλ‘  DSN이며, webpack.EnvironmentPlugin λ₯Ό 톡해 Raven을 μ‹€ν–‰ν•˜λ €λŠ” ν™˜κ²½μš©μœΌλ‘œ λΉŒλ“œν•  λ•Œλ§Œ μ„€μ •λ©λ‹ˆλ‹€.

κ·€ν•˜μ˜ λ²„μ „μ—μ„œλŠ” Angular ErrorHandlerλ₯Ό μ‘°κ±΄λΆ€λ‘œ μ„€μ •ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. λͺ¨λ“  κ²½μš°μ— μ„€μ •ν•˜κ³  무슨 일이 μžˆμ–΄λ„ 였λ₯˜λ₯Ό μ‚Όν‚€κ±°λ‚˜ κ³΅κΈ‰μžμ— λ‚˜μ—΄ν•˜μ§€ μ•Šκ³  계속 λ‚˜μ—΄ν•˜λ©΄ od dev둜 인해 전체 λͺ¨λ“ˆμ΄ μΆ©λŒν•©λ‹ˆλ‹€.

λ‚΄κ°€ μ•„λŠ” ν•œ 쑰건에 따라 Angular κ³΅κΈ‰μžλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μ €λŠ” 였늘 μˆ˜μ • μ‹œλ„λ₯Ό μ—¬λŸ¬ 번 λ°˜λ³΅ν–ˆμŠ΅λ‹ˆλ‹€.

μ†”μ§νžˆ λ§ν•΄μ„œ Raven λ¬Έμ œλΌκΈ°λ³΄λ‹€λŠ” Angular 문제처럼 λ“€λ¦½λ‹ˆλ‹€.

κ·Έλ ‡κΈ΄ ν•˜μ§€λ§Œ, 보닀 일반적인 μ†”λ£¨μ…˜μ΄ 쒋은 μΆ”κ°€ 사항이 될 κ²ƒμ΄λΌλŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€.

λͺ¨λ“  URLκ³Ό μΌμΉ˜ν•˜λŠ” ignoreUrls μ˜΅μ…˜ μ—μ„œ νŒ¨ν„΄μ„ μ„€μ •ν•΄ λ³΄μ…¨μŠ΅λ‹ˆκΉŒ? 그것이 당신이 ν•„μš”λ‘œ ν•˜λŠ” 것을 ν•΄μ€„κΉŒμš”? ignoreUrls: [/./] 같은 것 ?

μ•„λ‹ˆλ©΄ sampleRate λ₯Ό 0으둜 μ„€μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

Raven이 μš”μ²­μ„ 보내고 였λ₯˜λ₯Ό ν¬μ°©ν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 것이 κ°€λŠ₯ν•˜μ§€λ§Œ Angular ErrorHandlerκ°€ 였λ₯˜λ₯Ό μ‚Όν‚€λŠ” 것을 λ§‰μ§€λŠ” λͺ»ν•©λ‹ˆλ‹€(= μ΅œμ†Œν•œ 였λ₯˜κ°€ λ°œμƒν•œ μœ„μΉ˜μ—μ„œ μ‹€μ œ 행을 μΆ”μ ν•˜μ§€ λͺ»ν•˜λŠ” 경우).

λ‚˜λŠ” 당신이 μ˜³λ‹€κ³  μƒκ°ν•˜κ³  그것은 κ²°κ΅­ Raven의 λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€.

아직도 그것을 μ•Œμ•„λ‚΄λ €κ³  μ—¬κΈ° μ˜€λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄, 그것은 λ‚΄κ°€ μ²˜μŒμ— λ†“μΉœ ꡬ성 μ˜΅μ…˜μ΄μ—ˆμŠ΅λ‹ˆλ‹€ shouldSendCallback :

import Raven from 'raven-js';

const env = 'prod';
const release = '12345';

Raven
  .config('https://<example>@sentry.io/1234', {
    environment: env,
    release: release,
    shouldSendCallback: () => {
      // Do your logic here...
      return ['prod', 'staging'].indexOf(env) !== -1;
    },
  })
  .install();

shouldSendCallback κ°€ false $이면 λ³΄μ΄ˆκ°€ λ³΄κ³ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 πŸ‘ λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ— 쑰건뢀 보고 논리가 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

DSN을 빈 λ¬Έμžμ—΄λ‘œ λ§Œλ“œμ‹­μ‹œμ˜€. 보고가 λΉ„ν™œμ„±ν™”λ©λ‹ˆλ‹€

이 방법을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 그것은 λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€

if (environment.production) { Raven.config('https://@sentry.io/') .install(); }

그리고 κ³΅κΈ‰μžμ—μ„œ
providers: [environment.production ? { provide: ErrorHandler, useClass: RavenErrorHandler } : [], ...

μ—¬κΈ°μ„œ λ‚΄κ°€ 잘λͺ»ν•œ 것이 있으면 μ•Œλ €μ£Όμ„Έμš”.

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