Sentry-javascript: Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ - рд╕рдВрддрд░реА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдЕрдк

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЬреВрди 2019  ┬╖  35рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: getsentry/sentry-javascript

рд╣рд╛рдп рдЯреАрдо, рд▓рд╡ рд╕реЗрдВрдЯреНрд░реА, рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ w/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрддрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рдиреЛрдб рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрддрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рд╕рдЯреАрдХ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрддрд░реА рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╕рдВрдмрдВрдзрд┐рдд: https://forum.sentry.io/t/google-cloud-functions-client-setup/1970

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

рдзрдиреНрдпрд╡рд╛рдж! :)

рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рд╕рдЯреАрдХ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрддрд░реА рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

https://github.com/googleapis/nodejs-error-reporting# рдХреИрдЪрд┐рдВрдЧ-рдПрдВрдб-рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ-рдПрдкреНрд▓реАрдХреЗрд╢рди-рд╡рд╛рдЗрдб-рдЕрдирдХреЙрдЯ-рдПрд░рд░реНрд╕ рдФрд░ https://github.com/googleapis/nodejs-error-reporting#unhandled рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рдЕрд╕реНрд╡реАрдХрд░рдг рдЕрдм рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╕реНрд╡рдпрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЦрд╛рд▓реА рд╕рдордп рд╣реИ рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрдкрд┐рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ :)

рдзрдиреНрдпрд╡рд╛рдж @kamilogorekред рджрд┐рд▓рдЪрд╕реНрдк!

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ w/Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рддрдХрдиреАрдХреА рдпреЛрдЬрдирд╛ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдЬрд▓реНрдж рд╣реА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдХрд░рддрд╛/рдХрд░рддреА рд╣реВрдВред :)

рдЕрднреА рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЗрд╕рдореЗрдВ рд▓рдкреЗрдЯ рд░рд╣реЗ рд╣реИрдВ:

try () {
...
} catch (e) {
  Sentry.captureException(e);
}

рд▓реЗрдХрд┐рди рд╣рдо рд╕рдВрддрд░реА рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╛ рдЕрдиреНрдп рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕ рдПрдХреАрдХрд░рдг рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ?

@vpontis рдиреЗ рдЕрднреА рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рд╕рдВрдХрд▓реНрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреНрдпрд╛ рд╣реИ?

image

рд╣рд╛рдп @kamilogorek рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЙрд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЪрд░ рдирд╣реАрдВ рд╣реИрдВред рдЬреИрд╕реЗ рдЖрдк рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рдпрдерди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ?

image


рд╕рд╛рде рд╣реА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ рдЬрдм рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрддрд╛/рдкрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рд╕реНрдЯреНрд░реАрдо/рдИрд╡реЗрдВрдЯ рдкрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЖрдкрдХреА рдХреНрдпрд╛ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ? рдХреНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдФрд░ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?

image


рд╕рд╛рде рд╣реА, рдЗрди рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ?

image

рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЪрд░ рдирд╣реАрдВ рд╣реИрдВред рдЬреИрд╕реЗ рдЖрдк рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рдпрдерди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ?

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

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

рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕реЙрдХреЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрдм рдЖрдк рдбреАрдмреА рдХреНрд╡реЗрд░реА, рдкреНрд░реЙрдХреНрд╕реА рдХреЙрд▓ рдпрд╛ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рддреЗ рд╣реИрдВ, рдЖрдк рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Sentry.configureScope(scope => scope.clear())
// or
Sentry.configureScope(scope => scope.clearBreadcrumbs())

рдПрдХ рд╕рд╛рдл рд╕реНрд▓реЗрдЯ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

рд╕рд╛рде рд╣реА, рдЗрди рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ?

рдЕрдкрдиреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ Enable JavaScript source fetching рдмрдВрдж рдХрд░реЗрдВ, рдЙрджрд╛. https://sentry.io/settings/kamil-ogorek/projects/testing-project/
рдпрд╣ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдиреЛрдб рдРрдк рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

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

рд▓рд╛рдирдд рд╣реИред рдореБрдЭреЗ рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдЖрдпрд╛!

рд╕реБрдкрд░ рдорджрджрдЧрд╛рд░, рдзрдиреНрдпрд╡рд╛рдж рдХрд╛рдорд┐рд▓ред рдореИрдВ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдФрд░ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЖрдкрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдкрд░ рд╕рдВрддрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧреАред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдореИрдВ рдЯреНрд░рд╛рдЗрдПрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рд╕рдордп рдкрд┐рдВрдЧ рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛! :)

@kamilogorek рдореИрдВрдиреЗ Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдЬреЛрдбрд╝реЗ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ? рдореИрдВ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЛ рдХреЗрд╡рд▓ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз w/Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдХреИрд╕реЗ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕ рддрд░рд╣ рд╕рдм рдХреБрдЫ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@kamilogorek рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд░рд╣реЗ рд╣реИрдВ!

рд╣рдордиреЗ рдбреЙрдХрд░ / рдиреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдЖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдЖ рдПрдХреАрдХрд░рдг рдЗрд╕ рддрд░рд╣ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ: https://docs.sentry.io/platforms/node/koa/

рдпрд╣ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдбрдХреНрд░рдВрдм рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рд╕реЗ рдмрдВрдзреЗ рдмреНрд░реЗрдбрдХреНрд░рдВрдмред

рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ?

рд╡рд╣рд╛рдБ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣рд╛рдБ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :)
рдореИрдВ ~ 1-2 рджрд┐рдиреЛрдВ рдореЗрдВ рдЖрдкрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред

@kamilogorek рдЖрдк рдПрдХ рдкрд░рдо рдХрд┐рдВрд╡рджрдВрддреА рд╣реИрдВ рдореЗрд░реЗ рджреЛрд╕реНрдд

@vpontis рддреЛ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рдЕрдкрдиреЗ рдХрд┐рд╕реА рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдПрдХ рдбреЛрдореЗрди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдирд╛ред рдПрдХ рдмрд╛рд░ рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдПрд╕рдбреАрдХреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдЖрдк parseRequest рдХреЛ рд╡рд╣рд╛рдВ рднреА рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред (рдЙрджрд╛рд╣рд░рдг https://github.com/koajs/examples/blob/master/errors/app.js рдкрд░ рдЖрдзрд╛рд░рд┐рдд)

const Sentry = require("@sentry/node");
const Koa = require("koa");
const app = (module.exports = new Koa());
const domain = require("domain");

Sentry.init({
  // ...
});

app.use(async function(ctx, next) {
  const local = domain.create();
  local.add(ctx);
  local.on("error", next);
  local.run(() => {
    Sentry.configureScope(scope => {
      scope.addEventProcessor(event => Sentry.Handlers.parseRequest(event, ctx.request));
    });
    next();
  });
});

app.use(async function(ctx, next) {
  try {
    await next();
  } catch (err) {
    // some errors will have .status
    // however this is not a guarantee
    ctx.status = err.status || 500;
    ctx.type = "html";
    ctx.body = "<p>Something <em>exploded</em>, please contact Maru.</p>";

    // since we handled this manually we'll
    // want to delegate to the regular app
    // level error handling as well so that
    // centralized still functions correctly.
    ctx.app.emit("error", err, ctx);
  }
});

// response

app.use(async function() {
  throw new Error("boom boom");
});

// error handler

app.on("error", function(err) {
  Sentry.captureException(err);
});

if (!module.parent) app.listen(3000);

parseRequest рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдпрд╣ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╕рд╛ рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - https://github.com/getsentry/sentry-javascript/blob/f71c17426c7053d46fe3e2e35e77c564749d0eb7/packages/node/src/handlers .ts#L177

рдзрдиреНрдпрд╡рд╛рдж @kamilogorek!

рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

  1. рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЛрдб req рдФрд░ res рдХреЛ рдЙрд╕ рдбреЛрдореЗрди рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ ctx.req рдФрд░ `ctx.res рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ

  2. рдЖрдк рдиреЛрдб рдореЗрдВ req рд╕реЗ parseRequest . рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

  3. рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк ctx.app.emit("error", err, ctx); рдХреНрдпреЛрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ?

    // since we handled this manually we'll
    // want to delegate to the regular app
    // level error handling as well so that
    // centralized still functions correctly.
    ctx.app.emit("error", err, ctx);

рдХреНрдпрд╛ рдпрд╣ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

  1. рдХреЛрдЖ рдореЗрдВ next рд╣реИ async ред рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА domain.run(...)

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрдкрд░, рд╕реБрдкрд░ рдорджрджрдЧрд╛рд░ рд╣реИред рдореИрдВ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛ред

рдЖрд╣ рд░реЗ 3 рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдмрд╕ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдирдХрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреВрдБрдЧрд╛ :)ред рдЕрднреА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг...

рд╣рдореНрдо, рдореБрдЭреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдЖ рдореЗрдВ рдбреЛрдореЗрди рдХреЙрд▓рдмреИрдХ рдФрд░ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдорд┐рд╢реНрд░рдг рдХреЗ рдХрд╛рд░рдг рд╣реИред

рдРрд╕рд╛ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЛрдореЗрди рдиреЛрдб 12 рдореЗрдВ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВ рдПрд╕рд┐рдВрдХреНрд╕ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрдж рд╣реА рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ)ред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдРрдк рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдореМрдЬреВрджрд╛ "рд╣рдм" рдХреЛ ctx рдкрд░ рдбрд╛рд▓рдиреЗ рдФрд░ addBreadcrumb рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рдореМрдЬреВрджрд╛ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ? рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрддрд░реА рдореЗрдВ рд╣рдм рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...

рдореБрдЭреЗ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ (рдпреЗ рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ) рд▓реЗрдХрд┐рди рдореИрдВ _why_ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...

export const setSentryDomain = async (ctx, next) => {
  await new Promise(async (resolve, reject) => {
    const local = domain.create();

    local.add(ctx.req);
    local.add(ctx.res);

    local.run(async () => {
      Sentry.configureScope((scope) => {
        scope.addEventProcessor((event) => Sentry.Handlers.parseRequest(event, ctx.req));
      });

      await next();
      resolve();
    });
  });
};

export const catchErrors = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    console.log('got error');
    ctx.app.emit('error', err, ctx);
  }
};

рдореИрдВ рдЗрд╕реЗ рдПрдХ рд░рд╛рдд рдХрд╣ рд░рд╣рд╛ рд╣реВрдБред рдореБрдЭреЗ рдРрд╕рд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЦреБрд╢ рдерд╛ред

рдореИрдВрдиреЗ рдпрд╣ рднреА рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд░реЗрдбрдХреНрд░рдВрдм console.log рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реЗ рд╣реИрдВ рдЬреЛ рд╕рдВрддрд░реА рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рддреЛ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЗрди рдмреНрд░реЗрдбрдХреНрд░рдВрдмреЛрдВ рдХреЛ рд╕рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдпрд╛ рдЬрд╛рдП ...

рдореИрдВрдиреЗ рдХреЛрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреЛрдХ рдХрд┐рдпрд╛ рдФрд░ рдбреЛрдореЗрди рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбреЛрдореЗрди рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдЬрд▓реНрдж рд╣реА рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ...

рдХреНрдпрд╛ рд╕реАрдЯреАрдПрдХреНрд╕ рдкрд░ рд╡рд░реНрддрдорд╛рди "рд╣рдм" рдбрд╛рд▓рдиреЗ рдФрд░ рдПрдбрдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ?

рдЖрдк рд╣рдм рдХреЛ рд╕реАрдзреЗ ctx рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдм рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ Sentry.getCurrentHub() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, domain.active рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рд▓реЗрдХрд┐рди рдбреЛрдореЗрди рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдЬрд▓реНрдж рд╣реА рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ...

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

рд╣рдо рдЕрднреА zone.js рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХрд╛рдлреА рдорджрдж рдорд┐рд▓реЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ PoC рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рд╣рдо рдбреЛрдореЗрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рд╣рд╛рдп @kamilogorek ,

рдореИрдВ рд╕рдВрддрд░реА рдореЗрдВ рдмрд┐рдирд╛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдЖрдкрдиреЗ https://github.com/getsentry/sentry-javascript/issues/2122#issuecomment -503440087 рдореЗрдВ рдХреНрдпрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Google рдЖрдкрдХреЛ process.on('uncaughtException') рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдореИрдВ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрддрд░реА рдореЗрдВ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ред

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

рд╣рдо рдПрдХ wrap рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЯреНрд░рд╛рдИ/рдХреИрдЪ tbh рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред

exports.helloBackground = (data, context) => {
  return `Hello ${data.name || 'World'}!`;
};

// becomes

exports.helloBackground = (data, context) => {
  return Sentry.wrap(() => {
    return `Hello ${data.name || 'World'}!`;
  })
};

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдлрд╛рдпрд░рдмреЗрд╕/рдЧреВрдЧрд▓ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрд▓рд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдкрд░ рд╕реЗрдЯ рдЕрдк рдХреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ рдФрд░ рдирд┐рд░рд╛рд╢ рд╣реБрдЖ рдЬрдм рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕реЗрдЯ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЬреАрд╕реАрдкреА (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп) рдкрд░ рдЕрдиреБрднрд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

@goleary рдХреНрдпрд╛ рдЖрдк рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рдЬреЛ рдЖрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдпрд╣ рдзрд╛рдЧрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж

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

@marcospgp рдирд╣реАрдВ, рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Google рд╕реНрд╡рдпрдВ рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд┐рдкреЛрд░реНрдЯрд░ рдХреЛ рджреЗрдЦреЗрдВ - https://cloud.google.com/error-reporting/docs/setup/nodejs рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рдХреЙрд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╣рдореНрдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВрдиреЗ рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЬреЛ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдкрд░ рд╕рдВрддрд░реА рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдФрд░ рдореБрдЭреЗ рдЕрднреА рдПрдХ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдорд┐рд▓реА - рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ!

рдпрд╣рд╛рдБ рдореЗрд░рд╛ index.js рд╣реИ, рдЬрд╣рд╛рдБ рд╕рднреА рд╕рдВрддрд░реА рдХреЛрдб рд╣реИрдВ:

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const Sentry = require("@sentry/node");

/**
 * Set up Sentry for error reporting
 */
if (functions.config().sentry && functions.config().sentry.dsn) {
  Sentry.init({ dsn: functions.config().sentry.dsn });
} else {
  console.warn(
    "/!\\ sentry.dsn environment variable not found. Skipping setting up Sentry..."
  );
}

admin.initializeApp();

const { function1 } = require("./cloud-functions/function1");
const { function2 } = require("./cloud-functions/function2");

module.exports = {
  function1,
  function2
};

@marcospgp рдЙрдкрд░реЛрдХреНрдд index.js рдерд╛ рдЬреЛ ./cloud-functions/function1 рдФрд░ ./cloud-functions/function2 рдХреЗ рднреАрддрд░ рд╕рдВрддрд░реА рдХреЛ рдмреЗрдЬреЛрдбрд╝ рдЕрдкрд╡рд╛рдж рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рднреАрддрд░ рд╕рдВрддрд░реА рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рдерд╛?

рдореИрдВрдиреЗ рдЕрднреА @marcospgp рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ( sentry.captureException() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ?)

рдпрд╣рд╛рдВ @goleary рдХреЗ рд╕рдорд╛рди, рдХреБрдЫ рднреА рд▓реЙрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .wrap() рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЛрд╢рд┐рд╢/рдХреИрдЪ рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП?

@Dinduks рдореИрдВ рдпрд╣реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдУрд╡рд░рд╣реЗрдб рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рд▓реЗрдХрд┐рди рд╕рдВрддрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдЧрд┐рдВрдЧ (рдорд╣рд╛рди рдирд╣реАрдВ) рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

@Dinduks wrap рдЕрднреА рднреА рд╣реИ, рджреЗрдЦреЗрдВ: https://github.com/getsentry/sentry-javascript/blob/master/packages/browser/src/exports.ts#L40
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рджреЗрддрд╛ рд╣реИред рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдорд┐рдд рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝реЙрд▓рдмреИрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

const myHandler = (req, res) => Sentry.wrap(() => {
  someFunctionThatCanBreak(req);
  return res.send(200);
});

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рдРрд╕рд╛ рдЖрд╡рд░рдг рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

import * as Sentry from "@sentry/node";

export const sentryWrapper = (f) => {
  return async function () {
    try {
      // eslint-disable-next-line prefer-rest-params
      return await f.apply(this, arguments);
    } catch (e) {
      Sentry.captureException(e);
      await Sentry.flush(2000);
      throw new Error(e);
    }
  };
};

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

export const getChannelVideoTest = functions.https.onRequest(
  sentryWrapper(async (req, res) => {
    someFunctionThatCanBreak(req);
    return res.send(200);
  }),
);

рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@ рдХрд╛рдорд┐рд▓реЛрдЧреЛрд░реЗрдХ
рдореИрдВ рдЗрд╕рд╕реЗ рднреА рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВрдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ Sentry.init() рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рдХреЛрдб рдХреЛ try {} catch {} рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рдХреЙрд▓ рдХреЛ Sentry.captureException рдФрд░ Sentry.flush() рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдореИрдВ try/catch рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдХреБрдЫ рднреА рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдорд┐рд▓ рдкрд╛ рд░рд╣рд╛ рд╣реИред
рд╡рд╣реА рдкреНрд░рджрд░реНрд╢рди рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ Sentry.startTransaction() рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЗрдирджреЗрди рдирд╣реАрдВ рдХрд░рддрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ?
рдХреНрдпрд╛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддрд░реА рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?
рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдЯреИрдм рд╣рдореЗрд╢рд╛ рд╡рд┐рдлрд▓рддрд╛ рджрд░ рдХреЛ 0% рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛? (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрди-рджреЗрди рдареАрдХ рд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдареАрдХ рд╕реНрдерд┐рддрд┐ рд╣реИ?)

@axelvaindal рд╣рдо рдЕрднреА рддрдХ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдирд┐рдЧрд░рд╛рдиреА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рд▓рд┐рдП:

рдХреНрдпрд╛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддрд░реА рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

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

рдЖрдк рд╣рдорд╛рд░реЗ AWSLambda рд╣реИрдВрдбрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗрдВ рдХрд┐ рдЙрд╕ рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП - https://github.com/getsentry/sentry-javascript/blob/master/packages/serverless/src/awslambda.ts

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

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

kishor-bhatt picture kishor-bhatt  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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

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