μ΄κ²μ Sentryμ μμΈλ₯Ό λ³΄κ³ νλ κ²μ΄ 보μ₯λ©λκΉ?
try {
// code
} catch (e) {
const eventId = Sentry.captureException(e);
console.log('sentry event', eventId);
process.exit(1);
}
μ΄λ²€νΈ IDκ° λ‘μ»¬λ‘ μμ±λλμ§ μ격μΌλ‘ μμ±λλμ§ λ¬Έμκ° λͺ ννμ§ μμ΅λλ€. λ°°μκ° μ ν κ΄λ ¨μ΄ μμ΅λκΉ? https://docs.sentry.io/error-reporting/configuration/draining/?platform=node
μ΄κ²μ κ°μ‘°ν΄ μ£Όμ μ κ°μ¬ν©λλ€. μμ ν λκΈ°νλμ§ μμμμ λͺ νν νκΈ° μν΄ "μ μ‘"μ΄ λ°±κ·ΈλΌμ΄λμμ μ€ν μ€μ λλ€. λ°λΌμ μλ°ν λ§ν΄μ μ΄λ²€νΈκ° Sentryμ λλ¬νλ€λ 보μ₯μ μμ΅λλ€.
eventId
λ SDKμμ λ‘μ»¬λ‘ μμ±λλ©° μλ²μμ μ΄λ²€νΈλ₯Ό μμ§νλ λ° μ¬μ©λ©λλ€.
μ΄λ₯Ό λͺ νν νκΈ° μν΄ λ¬Έμλ₯Ό μ λ°μ΄νΈν κ²μ λλ€.
μ, λͺ ννκ² νκΈ° μν΄ μ¬κΈ°μ μ€λͺ λ λ΄μ©μ μ€μ λ‘ κ΅¬νν΄μΌ ν©λλ€. https://docs.sentry.io/error-reporting/configuration/draining/?platform=node
λ§μ΅λκΉ, @HazAT?
@rhyek Corrent , λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈνλ €λ©΄ λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈνκΈ° μν΄ νλ¬μλ₯Ό κΈ°λ€λ¦΄ μ μμ΅λλ€.
capture*
λ©μλμμ promiseλ₯Ό λ
ΈμΆνλ κ²μ΄ λ μ’μ§ μμκΉμ? APIλ μ½μμ λ°ννλ©΄ μ¬μ©μμκ² μ΄λ²€νΈκ° μ μ‘λμλμ§ νμΈνκΈ° μν΄ await
ν΄μΌ ν¨μ μ리거λ μ μ‘λκΈ°λ₯Ό λ°λΌλ κ²μ μμ΄λ²λ¦¬κΈ° λλ¬Έμ λ λͺ
νν©λλ€. close
μ flush
λ λͺ¨λ λΉλκΈ°μμΌλ‘ μκ°λμλ κ²μ λκΈ°μμΌλ‘ λ§λ€λ €λ λͺ¨νΈν μ νΈλ¦¬ν°μ λ©μλμ
λλ€. κ²λ€κ°, μ΄ λ κ°μ§ λ°©λ² λͺ¨λ μμ ν λ§κ°μ‘μ΅λλ€. μ¬μ€, κ½€ λ§μ λ¨μ μ΄ μμ΅λλ€. (λλ κ·Έκ²μ΄ λ²κ·ΈλΌκ³ λ§νκ³ μΆμ§λ§ μλ§λ μ΄κ²μ κ·Έκ²μ 보λ μ¬λμ POVμ λ¬λ € μμ΅λλ€):
timeout
μ μ λ¬ flush
κ·Έκ²μ΄ μμ²μ μ μ‘μ λ°©ν΄νμ¬ κ΅ν΅ μ‘΄μ€νμ§ μκΈ° λλ¬Έμ nullμ
λλ€. νμ΄λ¨Έκ° λ§λ£λλ©΄ λ°νλ μ½μμ false
λ‘ ν΄κ²°ν©λλ€. λλ μ¬μ ν λ μμ μκ² κ·Έλ¬ν μ½λμ νλμ μ μ©μ±μ λ¬»κ³ μμ΅λλ€.flush
λ©μλλ νΈμΆλ λλ§λ€ timeout
μ λλ¬νλ μ¦μ ν΄κ²°λλ μ μ½μμ λ°νν©λλ€. λ κ°μ§ λ¬Έμ κ° μμ΅λλ€. setInterval
μν΄ μ€νλ μ 체 μ½λλ μ΅μν λΈλΌμ°μ μ½μμ ν
μ€νΈμμ λ§€μ° λλ¦¬κ³ μ ν μκ°μ΄ λ§λ£λ ν μ½μμ΄ λ§μ μκ° λμ ν΄κ²°λμμ΅λλ€. λ λ²μ§Έμ΄μ λ μ€μν λ¬Έμ λ _isClientProcessing
ν¨μμ μ½λκ° νΈμΆλ λλ§λ€ μκ° μ΄κ³Όλ₯Ό μ§μ°λ―λ‘ λκ΅°κ°κ° Promise.all([fush(), flush()])
μ κ°μ μμ
μ μννλ κ²½μ°(μ κ·Έκ° ν΄μΌ νλμ§ λͺ¨λ₯΄κ² μ΅λλ€. νμ§λ§ APIλ κ·Έκ° νκ³ μΆμ λλ§λ€ μλ‘μ΄ μ½μμ λ°ννκΈ° λλ¬Έμ κ·Έλ° μ½μμ μ λ ν΄κ²°λμ§ μμ΅λλ€.Corrent, λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈνλ €λ©΄ λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈνκΈ° μν΄ νλ¬μλ₯Ό κΈ°λ€λ¦΄ μ μμ΅λλ€.
μ³μ§ μμ΅λλ€. νλ¬μλ₯Ό κΈ°λ€λ¦¬λ λμμλ λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμ ν μ μλ μ΄μ λ₯Ό μ΄ν΄νλ €λ©΄ μμ μ μμ μ μ°Έμ‘°νμμμ€. λλ κ·Έλ¬ν API λμμΈμ΄ μμ ν λ§κ°μ‘λ€κ³ λ§νκ³ μΆμ΅λλ€. κ·Έλ¦¬κ³ λͺ¨λμκ² μλν μ μλ μ’ λ£ APIλ₯Ό ꡬμΆνλ €κ³ μλνλ λμ μ μ΄λ²€νΈ μ μ‘μ λνλ΄λ μ½μμ κΈ°λ€λ¦¬λ μ νμ μ¬μ©μμκ² λ§‘κΈ°μ§ μλ μ΄μ λ₯Ό μ λ§λ‘ μ΄ν΄ν μ μμ΅λλ€. ν΅ν© APIκ° μλν΄μΌ νλ μΈμ΄
μ΄λ²€νΈκ° λ§μ§λ§μΌλ‘ μ’
λ£λ λ ν΄κ²°λλ μ½μμ μ‘μΈμ€ν μ μλ€κ³ μκ°ν©λλ€.
μ΄ μ€λ λμ μ€λͺ
λ λ€λ₯Έ λ°©λ²κ³Ό ν¨κ» 보λΈ
λ§μ μλ―Έ.
2019λ
5μ 11μΌ ν μμΌ μ€ν 12:29 Stefano Arlandini [email protected]
μΌλ€:
μΊ‘μ²*μμ μ½μμ 곡κ°νλ κ²μ΄ μ’μ§ μμκΉμ?
νλ μμ? APIλ μ½μμ λ°ννλ©΄ μ¬μ©μμκ²
μ΄λ²€νΈκ° μ μ‘λμλμ§ νμΈνλ €λ©΄ κΈ°λ€λ €μΌ ν©λλ€.
μ μ‘λκΈ°λ₯Ό λ°λΌλ©΄μ λΆμ λΆμ΄κ³ μμ΄λ²λ¦¬μμμ€. λ«κΈ°μ νλ¬μ λͺ¨λ
λκΈ°νλ 무μΈκ°λ₯Ό λ§λ€λ €κ³ νλ λͺ¨νΈν μ νΈλ¦¬ν°
λΉλκΈ°μμ΄λΌκ³ μκ°νμμμ€. λν μ΄ λ κ°μ§ λ°©λ² λͺ¨λ μμ ν κΉ¨μ‘μ΅λλ€.
μ¬μ€, λͺ κ°μ§ λ¨μ μ΄ μμ΅λλ€(λ²κ·ΈλΌκ³ λ§νκ³ μΆμ§λ§
μλ§λ μ΄κ²μ κ·Έλ€μλ³΄κ³ μλ μ¬λμ POVμ λ¬λ € μμ΅λλ€) :
- νλ¬μλ‘ μ λ¬λ νμμμμ λͺ©μ μ nullμ΄ μλκΈ° λλ¬Έμ nullμ λλ€.
μμ² μ μ‘μ μ€λ¨νμ¬ μ μ‘μ μν΄ μ‘΄μ€λ©λλ€. κ·Έκ²
νμ΄λ¨Έκ° λ§λ£λλ©΄ λ°νλ μ½μμ falseλ‘ ν΄κ²°ν©λλ€.
λλ μ¬μ ν λ μμ μκ² κ·Έλ¬ν μ½λμ νλμ μ μ©μ±μ λ¬»κ³ μμ΅λλ€.- flush λ©μλλ νΈμΆλ λλ§λ€ μλ‘μ΄ promiseλ₯Ό λ°νν©λλ€.
μκ° μ΄κ³Όμ λλ¬νλ μ¦μ ν΄κ²°λ©λλ€. λ κ°μ§ λ¬Έμ κ° μμ΅λλ€.
setIntervalμ μν΄ μ€νλλ μ 체 μ½λλ μ΅μν λ€μμμ λ§€μ° λ립λλ€.
λΈλΌμ°μ μ½μμμ λ΄ ν μ€νΈμ μ½μμ λ§μ κ²μ ν΄κ²°νμ΅λλ€.
μ ν μκ°μ΄ λ§λ£λ ν μ΄. λ λ²μ§Έμ΄μ λ μ€μν λ¬Έμ λ
_isClientProcessing ν¨μμ μ½λκ° μκ° μ΄κ³Όλ₯Ό μ§μ°λ κ²
νΈμΆλ λλ§λ€ λκ΅°κ°κ° Promise.all([fush(),
flush()]) (μ κ·Έκ° κ·Έλ κ² ν΄μΌ νλμ§ λͺ¨λ₯΄κ² μ§λ§ APIκ° λ°ννκΈ° λλ¬Έμ
κ·Έκ° κ·Έκ²μ νλ €λ μ νΉμ λ°μ λλ§λ€ μλ‘μ΄ μ½μ) κ·Έλ¬λ©΄ κ·Έλ¬ν μ½μμ
μ λ ν΄κ²°λμ§ μμ΅λλ€.Corrent, λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈνλ €λ©΄ νλ¬μλ₯Ό κΈ°λ€λ¦΄ μ μμ΅λλ€.
λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈν©λλ€.μ³μ§ μμ, μ λΉμ μ νλ¬μνλ κ²μ κΈ°λ€λ¦¬κ³ μλμ§ μ΄ν΄νλ €λ©΄ μμ λ΄ μμ μ μ°Έμ‘°νμμμ€.
λͺ¨λ κ²μ΄ μ μ‘λμλμ§ νμΈν μ μμ΅λλ€. κ·Έλ° API λμμΈμ
μμ ν κ³ μ₯ λ¬κ³ μ μ¬μ©μμκ² λ§‘κΈ°μ§ μλμ§ μ΄ν΄ν μ μμ΅λλ€.
μ΄λ²€νΈ μ μ‘μ λνλ΄λ μ½μμ κΈ°λ€λ¦¬λ μ ν
λͺ¨λμκ² μλνμ§ μλ μ’ λ£ APIλ₯Ό ꡬμΆνλ λμ
ν΅ν© APIκ° μλν΄μΌ νλ μΈμ΄β
λΉμ μ΄ μΈκΈλμκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/getsentry/sentry-javascript/issues/2049#issuecomment-491533914 ,
λλ μ€λ λ μμκ±°
https://github.com/notifications/unsubscribe-auth/AAFLTSVSICZ7Y26UHCSMKWLPU4GATANCNFSM4HKUJ5ZQ
.
λν κ²°κ³Όλ₯Ό λ°ννλ λ©μλκ° λ°±κ·ΈλΌμ΄λμμ μ€νλ κ²μΌλ‘ κΈ°λνμ§ μμ΅λλ€. μ΄κ²μ΄ μ¬μ©μμκ² νΌλμ μμΈμ΄ λκΈ° λλ¬Έμ λλ€(λ¬Όλ‘ μ΄ λ¬Έμ μ μ£Όμ μ§λ¬Έ). λμ , μ½μμ΄ λ°νλλ©΄ λ―Έλμ μ¬ κ²μ΄κ³ μμ§ μ€λΉλμ§ μμ κ²μ λν μ리 νμμμΌ λΏμ΄λΌλ κ²μ΄ λΆλͺ ν©λλ€. κ·Έκ²μ κΈ°λ€λ¦΄ κ²μΈμ§ μλλ©΄ κ·Έλ₯ λΆμ λΆμ΄κ³ μμ΄λ²λ¦΄ κ²μΈμ§ μ νμ λΆλͺ ν μ¬μ©μμκ² λ¬λ € μμ΅λλ€. λν μ΄λ²€νΈ IDκ° λ‘컬μμ μμ±λκΈ° λλ¬Έμ(btwλ₯Ό μνν μ΄μ κ° μμ) μ΄λ€ μ΄μ λ‘ μ μ‘μ΄ μ΄λ²€νΈλ₯Ό 보λ΄μ§ λͺ»νκ³ μ¬μ©μκ° μννμ§ μμκΈ° λλ¬Έμ μ ν¨νμ§ μμ(μ¦μ λ°νλκΈ° λλ¬Έμ) 무μΈκ°λ₯Ό μ¬μ©ν μ μμ΅λλ€. κ·Έκ²μ λν΄ μμ§λ λͺ»νλ€.
@sentry/node
μ
κ·Έλ μ΄λν μ΄ν Sentryμ μλΉν λ¬Έμ κ° μμμ΅λλ€. λ λμ μ루μ
μ΄ λμ¬ λκΉμ§ raven-node
λ‘ λμκ° κ²μ
λλ€.
λͺ¨λ μλ²λ¦¬μ€ μ€νμ΄ λλ λ μμμ μκ° μ΄κ³Όλ‘ λκΈ°μ΄μ λΉμμΌ νλ κ²μ νμ€ν μ루μ μ΄ μλλΌ ν΄νΉμ²λΌ λκ»΄μ§λλ€. π€
μλν μ μλ λ λ§μ μλ₯Ό μ°Ύλ μ¬λλ€μ μν΄ β #1449 λ΄μ μ루μ μ€ μΌλΆκ° νλ¬μ± λ±μ λμμ΄ λλ€λ κ²μ λ°κ²¬νμΌλ©° μ΄ λ¬Έμ μ λν΄μλ λ§μ λ Όμλ₯Ό νμ΅λλ€.
(λλ€ λ° μλ²λ¦¬μ€μ μ€μ μ λκ³ μμ§λ§ νλ¬μ± λ°©μμ΄λ―λ‘ λμΌν κ°λ μ΄ λ€λ₯Έ νκ²½μμλ μλν κ°λ₯μ±μ΄ λμ΅λλ€).
λ§€λ² νλ¬μ±μ ν¬ν¨νμ§ μλ λ λμ λ°©λ²μ΄ μκΈ°λ₯Ό νμ€ν μ΄λ§ν©λλ€.
μ΄ μ€λ λμμ λ§ν λ΄μ©μ μμ ν λμν©λλ€. IMO λ°±κ·ΈλΌμ΄λμμ λΉλκΈ°λ₯Ό μ¨κΈ°λ λκΈ° λ©μλλ₯Ό μ¬μ©νλ κ²μ μ λ§ νΌλμ€λ½μ΅λλ€.
λ³΄μ΄ νμ΄ μ΄λ° μμΌλ‘ νλ λ°λ μμ£Ό μ’μ μ΄μ κ° μμ μ μμ΅λλ€. μ΄μ¨λ λ¬Έμμ λν μ
λ°μ΄νΈλ μ λ§ κ°μ¬ν κ²μ
λλ€.
@cibergarri λλ κ·Έ μ΄μ κ° sentry apisμ λν μ μ¬μ μΌλ‘ λλ¦° λ€νΈμν¬ νΈμΆμμ userland μ½λλ₯Ό μ°¨λ¨νμ§ μκ³ eventIdκ° μ¦μ λ°νλ μ μκΈ° λλ¬Έμ΄λΌκ³ μκ°ν©λλ€. λΉλκΈ° APIμμ κ°μ λ°ννλ κ²μ΄ νΌλμ€λ½κ³ λΉλκΈ° μ μ‘ κ³μΈ΅ νΈμΆμ λν΄ μΆ©λΆν μ€λ λ¨Έλ¬Όμ§ μλ μλ²λ¦¬μ€ μ€ν 컨ν μ€νΈμμ μ€λ₯κ° μλμΌλ‘ μμ€λ μ μλ€λ μ μ λμν©λλ€. ν κ°μ§ ν΄κ²°μ± μ ν¨μλ₯Ό λ κ°λ‘ λΆν νμ¬ μ¬μ©μκ° λΉλκΈ° λμμ μ νν΄μΌ νλλ‘ νλ κ²μ λλ€. μ:
Sentry.captureException() // -> returns eventId after successful submission to sentry
Sentry.captureExceptionAsync() // -> returns promise
λλ 맀κ°λ³μλ‘, μλ₯Ό λ€μ΄
Sentry.captureException(ex, {async: false}) // -> default, returns eventId after successful submission to sentry
Sentry.captureException(ex, {async: true}) // -> returns promise
μ΄λ²€νΈ IDλ νμ ν΄λΌμ΄μΈνΈμμ μμ±λλ―λ‘ λΉλκΈ° λλ λκΈ°ν APIλ μ€μνμ§ μμΌλ©° κ²°κ³Όμ μΌλ‘ μ΄λ²€νΈκ° μ€μ λ‘ μ μ‘λμλμ§ μ¬λΆλ₯Ό λνλ΄λ μ’μ μ§νκ° μλλλ€(λ λ€λ₯Έ λ¬Έμ imo). λν μ€λ μ μ κ° capture*
λ©μλμ λν΄ λκΈ° λ° λΉλκΈ° λ©μλλ₯Ό λͺ¨λ ν¬ν¨νλ μ μ¬ν μ루μ
μ PHP SDKμ μ μνμ§λ§ κ±°λΆλμμ΅λλ€. λλ ν΅ν© APIκ° λΉλκΈ°μ±μ μ¨κΈ°κ³ μΆμ΄νκ³ κ°λ°μλ€μ΄ μ½μμ λλ¬λ΄κ³ μΆμ΄νμ§ μλ μ§μ§ μ΄μ λ₯Ό μμ ν μ΄ν΄νμ§ λͺ»νμ§λ§, κ·Έλ€μ΄ μ΄κ²μ λ³κ²½νλ λ° κ·Έλ€μ§ κ°λ°©μ μ΄μ§ μμ κ² κ°μμ΅λλ€.
μ¬νκ²λ μ΄ λ¬Έμ λ‘ μΈν΄ μλ²λ¦¬μ€ νκ²½μ μΆμ μ€λ₯κ° λ무 μ€λ₯κ° λ°μνκΈ° μ½κΈ° λλ¬Έμ Sentryμμ μ ννμ΅λλ€. (μ, μμ΄λ¬λ.)
capture*Async
λ°©λ²μ λ§€μ° μ μ©νμ κ²μ
λλ€ π
μ΄μ λν μ λ°μ΄νΈλ₯Ό λ°μ μ μμ΅λκΉ?
@marcospgp μ νν 무μμ μκ³ μΆμ΅λκΉ? λ€λμμ΄ κΈ°λ‘ν λͺ¨λ κ²μ μ€λλ μλ μ¬μ ν μ ν¨ν©λλ€.
λλ λ¬Έμμλ λ³λλ‘ μ¬μ©μκ° μ½μμ μ‘μΈμ€νκΈ°λ₯Ό μνλ μ£Όμ λ° μ£Όμ μ체μ λν λ°μμμ λ§€μ° λΆλͺ νλ©° μ΄ imhoλ₯Ό νμ©νμ§ μμ μ λΉν μ΄μ κ° μλ€κ³ μκ°ν©λλ€.
λΆννλ v6 λ¦΄λ¦¬μ€ μ΄μ μλ λ°μνμ§ μμ κ²μ λλ€. μ£Όμ APIμ λν λ³κ²½ μ¬νμ΄ μκ³ λ§μ λ³κ²½ μ¬νμ΄ νμνκΈ° λλ¬Έμ λλ€. μ΄κ²μ κΈ°λ‘νκΈ° μν΄ λ‘λ맡μ μΆκ°νκ² μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
@sentry/node
μ κ·Έλ μ΄λν μ΄ν Sentryμ μλΉν λ¬Έμ κ° μμμ΅λλ€. λ λμ μ루μ μ΄ λμ¬ λκΉμ§raven-node
λ‘ λμκ° κ²μ λλ€.λͺ¨λ μλ²λ¦¬μ€ μ€νμ΄ λλ λ μμμ μκ° μ΄κ³Όλ‘ λκΈ°μ΄μ λΉμμΌ νλ κ²μ νμ€ν μ루μ μ΄ μλλΌ ν΄νΉμ²λΌ λκ»΄μ§λλ€. π€