рд╣рд╛рдп рдЯреАрдо, рд▓рд╡ рд╕реЗрдВрдЯреНрд░реА, рдзрдиреНрдпрд╡рд╛рдж!
рдореИрдВ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ w/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрддрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рдиреЛрдб рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрддрд╛ред
рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рд╕рдЯреАрдХ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ Google рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрддрд░реА рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рд╕рдВрдмрдВрдзрд┐рдд: https://forum.sentry.io/t/google-cloud-functions-client-setup/1970
рдзрдиреНрдпрд╡рд╛рдж! :)
рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рд╕рдЯреАрдХ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ 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 рдиреЗ рдЕрднреА рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рд╕рдВрдХрд▓реНрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп/рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреНрдпрд╛ рд╣реИ?
рд╣рд╛рдп @kamilogorek рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЙрд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЪрд░ рдирд╣реАрдВ рд╣реИрдВред рдЬреИрд╕реЗ рдЖрдк рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рдпрдерди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ?
рд╕рд╛рде рд╣реА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ рдЬрдм рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрддрд╛/рдкрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рд╕реНрдЯреНрд░реАрдо/рдИрд╡реЗрдВрдЯ рдкрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрдкрдХреА рдХреНрдпрд╛ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ? рдХреНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдФрд░ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?
рд╕рд╛рде рд╣реА, рдЗрди рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ?
рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдВрджрд░реНрдн рдЪрд░ рдирд╣реАрдВ рд╣реИрдВред рдЬреИрд╕реЗ рдЖрдк рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкрд╛рдпрдерди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ?
рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдлреАрдЪрд░ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬреЗрдПрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдкрдХреА рдХреНрдпрд╛ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ? рдХреНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдФрд░ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?
рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕реЙрдХреЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрдм рдЖрдк рдбреАрдмреА рдХреНрд╡реЗрд░реА, рдкреНрд░реЙрдХреНрд╕реА рдХреЙрд▓ рдпрд╛ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рддреЗ рд╣реИрдВ, рдЖрдк рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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!
рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:
рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЛрдб req
рдФрд░ res
рдХреЛ рдЙрд╕ рдбреЛрдореЗрди рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ ctx.req
рдФрд░ `ctx.res рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ
рдЖрдк рдиреЛрдб рдореЗрдВ req
рд╕реЗ parseRequest
. рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк 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);
рдХреНрдпрд╛ рдпрд╣ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
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