Sentry-javascript: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдБ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рджрд┐рд╕ре░ 2013  ┬╖  36рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: getsentry/sentry-javascript

рдореИрдВ raven.js рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред (рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐ Google Analytics рдИрд╡реЗрдВрдЯ рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

рдпрд╣рд╛рдБ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рддрдХ рдХреНрдпрд╛ рд╣реИ: https://gist.github.com/karolisdzeja/8010574

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЗрд╡реЗрди рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╡рд┐рд╡рд░рдг рдЦреЛ рджреЗрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдкреВрд░реА рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣рд╛рдВ рд╡рд╣ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд░реЗрд╡реЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ: https://gist.github.com/Kl0tl/ed0a9e74462a2294f4c8842f5389d8eaред

рдореЙрдХ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред Object.defineProperty рд╣рдореЗрдВ Raven рдареАрдХ рдмрд╛рдж рд╣реБрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдЗрд╡реЗрдВрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╕рднреА 36 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

+1

+1

+1

+1

рд╣рд░ рдХреЛрдИ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ - @karolisdzeja рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

рдЕрдВрддрдд:, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо Raven.js рд╕реНрд░реЛрдд рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрдм рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрдм Raven.js рд╕реНрд░реЛрдд рдкреГрд╖реНрда рдкрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЕрдВрддрддрдГ рдПрдХ рдХрд╕реНрдЯрдо рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛; рдЬреНрдпрд╛рджрд╛ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╣рдо рдЕрдкрдиреЗ рдбреЙрдХреНрд╕ рдореЗрдВ "рдХреИрд╕реЗ рдХрд░реЗрдВ" рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

@benvinegar рд╕рдорд╛рдзрд╛рди рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд╛рд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдкрд░ рд╕рдВрддрд░реА рдЯреАрдо рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИред

рджрд░рдЕрд╕рд▓, рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рдЬреЗрдПрд╕ рдПрд╕рдбреАрдХреЗ рдХреЛрдб рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛: https://dev.twitter.com/web/javascript/loading

рдкреГрд╖реНрда рд▓реЛрдб рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрддрд╛рд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рддрдм рдЦрдкрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрдм рдмрд╛рд╣рд░реА рдЬреЗрдПрд╕ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА API рдХреЙрд▓ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ .ready() рдХреЙрд▓ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдЧреБрдЬрд╝рд░рддреА рд╣реИрдВред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдХрд┐рдП рдмрд┐рдирд╛, рдХреЗрд╡рд▓ рдХреИрдкреНрдЪрд░ рдореИрд╕реЗрдЬ рдХреЗ рдмрдЬрд╛рдп рдЬреЗрдПрд╕ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рд┐рд░реНрдл raven.js рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ/рд╕реНрдердЧрд┐рдд рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ: рдпрд╣ window.onerror рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкреВрд░реНрдг-рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдЯреНрд░реЗрд╕рдХрд┐рдЯрд╡рд┐рдВрдбреЛрдСрдирдПрд░рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ raven.js рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛: https://gist.github.com/oroce/ec3786ba7eff59963842220c3ffc56b4

рдХреЛрдИ рд▓реАрдХ рдЪрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ window.onerror рд╣реИрдВрдбрд▓рд░ рд░рдЦрд╛, рд▓реЗрдХрд┐рди window.addEventListener('error', fn) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред

рд░реЗрд╡реЗрди рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рдВрджреБ рдкрд░ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдорджрдж traceKitWindowOnError ред рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: https://github.com/getsentry/raven-js/blob/master/dist/raven.js#L2074

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрддрдирд╛ рдЙрдЪрд┐рдд рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рдЬреЛ рд╣реИ рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рд╣реИрдВ:

  • рд░реЗрд╡реЗрди рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП window.onerror рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдХреЗ, рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХрдЯреНрд░реИрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ

    • рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рди рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдореВрд╣реАрдХрд░рдг рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛

    • рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ install() рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЛ рдЖрдЬрдорд╛рддрд╛/рдкрдХрдбрд╝рддрд╛ рд╣реИ

  • рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдирд┐рд╢рд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ (рд╡реЗ рд╕рднреА рдЗрд╕ рдХреЛрдб рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ)
  • рдХреЛрдИ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рд╕рдВрдЧреНрд░рд╣ рдирд╣реАрдВ

рдЗрд╕рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рдЧреБрдгрд╡рддреНрддрд╛ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдПрд╕рд┐рдВрдХ рдирд┐рд╖реНрдкрд╛рджрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдореИрдВ рдЬрд▓реНрдж рд╣реА рдЖрдкрдХреЛ рд░реЗрд╡реЗрди рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рдкрд░реЛрд╕рд╛ рдЬрд╛ рд╕рдХреЗред

@ рдмреЗрдирд╡рд┐рдиреЗрдЧрд░ рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВред рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рд╣реИрдВ (рдЙрд░реНрдл Google рдкреГрд╖реНрдареЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛) рдХреНрд▓рд╛рд╕рд┐рдХ (рдЕрд╡рд░реБрджреНрдз) рд░реЗрд╡реЗрди рддрд░реАрдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ Google рдкреГрд╖реНрда рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╣рдо рддреГрддреАрдп рдкрдХреНрд╖ рдХреЛрдб рдХреИрд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рд╡рд╣ рдХреАрдордд рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо ux, рдЧрддрд┐ рдФрд░ рдмреЗрд╣рддрд░ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реИрдВ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдорд╛рд░реЗ рдмрдВрдбрд▓ рдореЗрдВ рд░реЗрд╡реЗрди рдХреЛ рдмрдВрдбрд▓ рдХрд░рдирд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЕрдкрдиреЗ рдлреНрд░рдВрдЯрдПрдВрдб рдХреЛрдб рдХреЛ рдлреЛрд▓реНрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдлрд╝реИрдХреНрдЯрд░-рдмрдВрдбрд▓ рдЬреИрд╕реЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдХреЛ рдХрдИ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдпрд╛ рдЕрдзрд┐рдХ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрдИ рдмрдВрдбрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрд░реНрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдПрдХ рдмреЗрд╣рддрд░ рдЖрдИрдПрдордУ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВред

рдЙрди рд╕рднреА рдореЗрдВ рдЯреНрд░реЗрдб-рдСрдл рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╕рднреА рдЙрдкрд▓рдмреНрдз рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░ рд╕рдХреЗрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
async рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ onload рдИрд╡реЗрдВрдЯ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрдЬрд╛рдп onload рдИрд╡реЗрдВрдЯ, рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ async рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдпред

/**
 * Setup Js error lazy tracking
 * - Pros: doesn't block rendering, onload event
 * - Cons: lower quality error reports for lazy errors
 *
 * <strong i="9">@author</strong> vinhlh
 *
 * <strong i="10">@param</strong>  {object} window
 * <strong i="11">@param</strong>  {object} labJs
 * <strong i="12">@param</strong>  {string} ravenCdn
 * <strong i="13">@param</strong>  {string} sentryDsn
 */
(function(window, labJs, ravenCdn, sentryDsn) {
  var errors = [];
  var oldOnError = window.onerror;

  window.onerror = function() {
    errors.push(arguments);
    oldOnError && oldOnError.apply(this, arguments);
  };
  window.addEventListener('load', function() {
    labJs
      .script(ravenCdn)
      .wait(function() {
        window.onerror = oldOnError;
        Raven.config(sentryDsn).install();
        errors.forEach(function(args) {
          window.onerror.apply(this, args);
        });
      });
  });
})(window, $LAB, 'raven-js-3.8.1/dist/raven.js', 'https://[email protected]/9');

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреА рддрд░рд╣ рдПрдХ рдПрд╕рд┐рдВрдХ рд╕реНрдирд┐рдкреЗрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЯреНрд░реЗрдбрдСрдл рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред

рдмрд╕ рдПрдХ рдФрд░ рдЯрд┐рдкреНрдкрдгреАред рд╡реЗ рдЯреНрд░реЗрдбрдСрдлрд╝ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдХрдо-рдирд┐рд╖реНрдард╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд░реНрдерди рдЯрд┐рдХрдЯреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реВрдВ рдЬреЛ рд╡реЗ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ) рд░реЗрд╡реЗрди.рдЬреЗрдПрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░рд╛ рдбрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрд╕рд┐рдВрдХреНрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдореБрдЭрд╕реЗ рдкреВрдЫреЗрдВрдЧреЗ рдХрд┐ "рдХреЛрдИ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ" рдФрд░ рдЕрдиреНрдп рд╢рд┐рдХрд╛рдпрддреЗрдВ рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдо рдирд┐рд╖реНрдард╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдЧрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдЧреЛрд▓реА рд╣реИред рдореИрдВ

@ рдмреЗрдирд╡рд┐рдиреЗрдЧрд░ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд

@oroce - рд╣рд╛рдБ, рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде 100% рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рд▓реЛрдЧ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдареАрдХ рд╕реЗ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдЗрд╕ рд░рдгрдиреАрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдХрд░рдирд╛)ред

рдореИрдВ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ Install рдбреЙрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦреВрдВрдЧрд╛ - рдФрд░ рдореИрдВ рд╣рд░ рдЬрдЧрд╣ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдбрд╛рд▓реВрдВрдЧрд╛ред

рдпрд╣рд╛рдВ рдЖрдкрдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж / рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреА рдХрд░рдирд╛ред

рдпрд╣рд╛рдВ рд╡рд╣ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд░реЗрд╡реЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ: https://gist.github.com/Kl0tl/ed0a9e74462a2294f4c8842f5389d8eaред

рдореЙрдХ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред Object.defineProperty рд╣рдореЗрдВ Raven рдареАрдХ рдмрд╛рдж рд╣реБрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдЗрд╡реЗрдВрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЕрд░реЗ рджреЛрд╕реНрддреЛрдВ, рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд░реЗрдЧреБрди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВ?
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ :)

@Kl0tl рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж

рдпрд╣ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЕрднреА рднреА рд╕реНрдЯреЗрдЬ 3 рдореЗрдВ рд╣реИ рд▓реЗрдХрд┐рди рд╡реЗрдмрдкреИрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред

рд╣рдо рдХреЗрд╡рд▓ рд╡рд╛рджреЗ рдХреЛ рдПрдХ рдХрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рд╕рднреА рдХреЙрд▓рдмреИрдХ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

const RavenPromise = import('raven-js'); // async load raven bundle

// initial setup
RavenPromise.then(Raven => {
    Raven.config('url-to-sentry', options).install();
}):

// exported log function
export const logMessage = (level, logger, text) => {
    RavenPromise.then(Raven => {
        Raven.captureMessage(text, {level, logger});
    });
};

рдЗрд╕реА рддрд░рд╣ @zanona рдореИрдВ рднреА Raygun рдпрд╛ Google Analytics рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЛрдб рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдпрд╣рд╛рдВ analytics.js рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

<script async src="https://www.google-analytics.com/analytics.js"></script>
<script>
    window.ga = window.ga || function () {
        (ga.q = ga.q || []).push(arguments)
    }
    ga.l = +new Date

    ga('create', 'UA-XXXXX-Y', 'auto')
    ga('send', 'pageview')
</script>

@benvinegar рдХреНрдпрд╛

@kireerik рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдм рдЖрдкрдХреЛ рдПрдХ рд╕рдЯреАрдХ рддрд┐рдерд┐ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ред

@kamilogorek рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ (рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдордХрд╛рдЬ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ)ред рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реИ!

рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд░реИрд╡реЗрдирдЬ рдХреЛ рдЕрд╕реАрдорд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рд╣реИ:
https://gist.github.com/MaxMilton/e2338b02b7381fc7bef2ccd96f434201

рдпрд╣ @oroce рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╢реАрд░реНрд╖ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд <script async src'='..."> рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд╣рд▓реЗ рд╕рдВрд╕рд╛рдзрди рд▓рд╛рдиреЗ рдХрд╛ рд╢реЗрдбреНрдпреВрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) + рдореИрдВ рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реВрдВ рдПрдХ рдЖрдИрдЖрдИрдПрдлрдИ рдФрд░ рдЕрдиреНрдп рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ред

@MaxMilton рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛! рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рд╕реНрд╡рд╛рдж рдмрдирд╛рдпрд╛ рд╣реИ:

<script async src="https://cdn.ravenjs.com/3.22.1/raven.min.js" crossorigin="anonymous" id="raven"></script>
<script>
    (function (sentryDataSourceName) {
        var raven = document.getElementById('raven')
        , isNotLoaded = true
        , errors = []
        raven.onreadystatechange = raven.onload = function () {
            if (isNotLoaded) {
                Raven.config(sentryDataSourceName).install()
                isNotLoaded = !isNotLoaded
                errors.forEach(function (error) {
                    Raven.captureException(error[4] || new Error(error[0]), {
                        extra: {
                            file: error[1]
                            , line: error[2]
                            , col: error[3]
                        }
                    })
                })
            }
        }
        window.onerror = function (message, source, lineNumber, colmnNumber, error) {
            if (isNotLoaded)
                errors.push([message, source, lineNumber, colmnNumber, error])
        }
    })('https://<key>@sentry.io/<project>')
</script>

рдореЗрд░рд╛ рднреА рдХреБрдЫ рд╕рд╡рд╛рд▓ рд╣реИ:

  • рдХреНрдпрд╛ crossorigin рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ script рдЯреИрдЧ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
  • рдХреНрдпрд╛ рдпрд╣ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ? рдЗрд╕ рдкрд░ рд▓реЗрдЦрдХ (@kamilogorek) рдХреА рдХреНрдпрд╛ рд░рд╛рдп рд╣реИ?

@kireerik рдЬрдм рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ crossorigin="anonymous" рдбрд╛рд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрдкрдХреЛ window.onerror рдИрд╡реЗрдВрдЯ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ (рдЙрд╕ рдмрд╛рд╣рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ) рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдлрд╝реЗрдЪ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рднреЗрдЬрдиреЗ рд╕реЗ рднреА рд░реЛрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЖрдк рддреГрддреАрдп рдкрдХреНрд╖ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдордбреАрдПрди рд╕рдВрджрд░реНрдн 1 , рдПрдордбреАрдПрди рд╕рдВрджрд░реНрдн 2 ред

рдЖрдк рдмрд╕ рддреНрд░реБрдЯрд┐ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЙрд╕ рд╕рдордп рдХреЗ _рдЕрдзрд┐рдХрддрдо_ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣реЛрдиреЗ рдХреА рдЪреЗрддрд╛рд╡рдиреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг 31 рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕) window.onerror рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП columnNo рдпрд╛ Error Object рдЧреБрдгреЛрдВ рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рд╕рдВрдЧрддрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╡рд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдордбреАрдПрди рд╕рдВрджрд░реНрдн ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдмреЛрдирд╕ рдЯрд┐рдк: рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдбрд╛рд▓ crossorigin рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдореЗрдВ рдпрд╣ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрд┐рдирд╛ crossorigin="anonymous" ред

FYI рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд░ рдХреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ:

  • рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ
  • рдмрдбрд╝реА рд╕рдлрд╛рдИ + рд╡рд░реНрдгрдирд╛рддреНрдордХ рдЪрд░ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рд╣рдореЗрд╢рд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреЛрдирд╕: рдкрд▓рдХ:)
  • рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдЖрдИрдПрдлрдИ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ
  • рддреНрд░реБрдЯрд┐ рд╕рд░рдгреА рдЖрдЗрдЯрдо рдХреЛ рджрд┐рдП рдЧрдП рдЧрд▓рдд рдкреИрд░рд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдВ

рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╕рд╛рд░ рджреЗрдЦреЗрдВ рдпрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рддреНрд╡рд░рд┐рдд рдХреЙрдкреА + рдкреЗрд╕реНрдЯ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

<!-- Sentry JS error tracking -->
<script async src="https://cdn.ravenjs.com/3.22.0/raven.min.js" crossorigin id="raven"></script>
<script>
(function(b,e,c,d){b.onerror=function(a,b,d,f,g){c||e.push([a,b,d,f,g])};b.onunhandledrejection=function(a){c||e.push([a.reason.reason||a.reason.message,a.type,JSON.stringify(a.reason)])};d.onreadystatechange=d.onload=function(){c||(c=!0,
Raven.config("___PUBLIC_DSN___").install(),
b.onunhandledrejection=function(a){Raven.captureException(Error(a.reason.reason||a.reason.message),{extra:{type:a.type,reason:JSON.stringify(a.reason)}})},e.forEach(function(a){Raven.captureException(a[4]||Error(a[0]),{extra:{file:a[1],line:a[2],col:a[3]}})}))}})(window,[],!1,document.getElementById("raven"));
</script>

<link rel="preconnect" href="https://sentry.io">

___PUBLIC_DSN___ рдХреЛ рдЕрдкрдиреЗ DSN рд╕реЗ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ </head> рдЯреИрдЧ рдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рд╕рд┐рд░ рдореЗрдВ рдЪрд┐рдкрдХрд╛ рджреЗрдВред рдпрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╣рд┐рдкреНрд╕реНрдЯрд░ рд╣реИрдВ рдЬреЛ рдЕрдм <head> рдФрд░ <body> рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг/рдРрдк рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдЬреИрд╕реЗ рд╕реАрдПрд╕рдПрд╕) рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рдж рд▓реЛрдб рдХреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХреЗрдВред

рдореЗрд░реЗ рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдЖрдИ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЗрддрдиреА рдмрд╛рд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдпрд╣ рдЕрднреА рд╕реНрдерд┐рд░ рд╕реНрддрд░ рдкрд░ рд╣реИред рдЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдЖрдиреЗ рдореЗрдВ рдордЬрд╝рд╛ рдЖрдпрд╛! :рд╕реНрдорд╛рдЗрд▓реА:

рдПрдХ рдмрд╛рд░ рд╕рдВрддрд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдб рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдЧреБрдгрд╡рддреНрддрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд┐рдВрдХ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛрддреА рд╣реИ? (рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдмрд╕ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ)

рдЙрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рднреА рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк lib рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рд░реЗрд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдЖрджрд┐ рд╕реЗрдЯ рдХрд░ рд╕рдХреЗрдВ?

@dalyr95 рд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдПрдХ рдХрд╕реНрдЯрдо рд░реЗрд╡реЗрди рд▓реЛрдб рдЗрд╡реЗрдВрдЯред

рдореЗрд░реЗ рдкрд╛рд╕ @ dalyr95 рдХреЗ рд╕рдорд╛рди рдЕрдиреБрд░реЛрдз рд╣реИред рдЕрднреА setUserContext() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд▓реЛрдбрд░ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдл рдирд╣реАрдВ рд╣реИред

рдирдорд╕реНрддреЗ, рд╕рдорд╕реНрдпрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╣рдо рдЕрдкрдиреЗ рдПрд╕рдбреАрдХреЗ рдХреА рдЕрдЧрд▓реА рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИрдВред
рдЙрд╕рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг (рдкреНрд░рдореБрдЦ рдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдмрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рд╣рдо рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕рднреА рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдзреИрд░реНрдп рд░рдЦреЗрдВред

рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,
рдЪреАрдпрд░реНрд╕!

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди 'undefined'!=k.setup&&k.setup(); рдХреЛ .install() рдХреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЬреЛрдбрд╝рдирд╛ рдерд╛, рдлрд┐рд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯ рдЗрдирд┐рдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде setup рд╕реЗ SENTRY_SDK рдирд╛рдордХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рд╛ред

рдПрд╕рд┐рдВрдХ рд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ Raven.config :

<script>
    Raven.config("https://<mydsn>@sentry.io/<projectid>", 
      {"release":"0.3.1",
       "environment":"dev",
       "user": {"id":"7b031fa0-32ff-46fe-b94b-e6bc201c3c5f",
                "organisation-id":"b1a50c41-b85e-4c50-9cec-c55ff36cf6d1"}}).install();
</script>

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕реЗ рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@danielcompton рдХреЗрд╡рд▓ рдмреИрдХрдПрдВрдб рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

THPubs picture THPubs  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

franciscovelez picture franciscovelez  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jaylinski picture jaylinski  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Nickforall picture Nickforall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dimmduh picture dimmduh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ