Sentry-javascript: рдореИрдВ @sentry/рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ?

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

рдкреИрдХреЗрдЬ + рд╕рдВрд╕реНрдХрд░рдг

  • [рдУ] @sentry/browser
  • [рдПрдХреНрд╕] @sentry/node
  • [ ] raven-js
  • [x] raven-node _(рдиреЛрдб рдХреЗ рд▓рд┐рдП рд░реЗрд╡реЗрди)_
  • [ ] рдЕрдиреНрдп: Angular6 + Ngrx6

рд╕рдВрд╕реНрдХрд░рдг:

@sentry/browser": "4.4.2"

рд╡рд┐рд╡рд░рдг

рдирдорд╕реНрддреЗ,
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ Angular6 + Ngrx6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╡реЗрдмрдПрдк рдПрдкреАрдЖрдИ рдХреЙрд▓ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рддреЛ рд╕рдВрддрд░реА рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рднреЗрдЬрдирд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП, рдореИрдВ /abc/3 рдирд╛рдордХ рдПрдХ рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ 404 Not Found рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
рдФрд░ рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕реЗрдВрдЯреНрд░реА рдХреЛ @sentry/browser рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗрд╡рд╛ рдмрдирд╛рдИ рд╣реИред

@Injectable({
  providedIn: 'root'
})
export class SentryService {
  constructor() { }
  captureException(error: any) {
    Sentry.captureException(error.originalError || error);
    throw error;
  }
}

рдФрд░ SentryErrorHandler рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдХреЛрдгреАрдп рдХреЗ ErrorHandler рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ

@Injectable()
export class SentryErrorHandler implements ErrorHandler {
  constructor(private sentry: SentryService) {}
  handleError(error: any): void {
    this.sentry.captureException(error);
    throw error;
  }
}

рдпрд╣ рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐
abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИред (рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд╣рд╛ /abc/3 )

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ ErrorInterceptor рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдХреЛрдгреАрдп рдХреЗ HttpInterceptor рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
    constructor(
        private _injector: Injector,
        private sentry: SentryService
    ) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req)
        .pipe(
            tap(event => {}, error => {
                if (error) {
                    this.sentry.captureException(error);
                }
            })
        );
    }
}

рддрдм рдореИрдВ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рдВрддрд░реА рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред
рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреНрд░реЛрдо рдиреЗрдЯрд╡рд░реНрдХ рдЯреИрдм рдЪреЗрдХ рдХрд┐рдпрд╛ред рдФрд░ рдореБрдЭреЗ рдПрдХ рд╕рдВрджреЗрд╢ рдорд┐рд▓рд╛:
"рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛: рддреНрд░реБрдЯрд┐, рд╢реАрд░реНрд╖рд▓реЗрдЦ, рд╕рдВрджреЗрд╢, рдирд╛рдо, рдареАрдХ рд╣реИ ..."

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ рд╕рдВрддрд░реА/рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ Non-Error exception captured with keys: error, headers, message, name, okтАж . рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рддреЛ рдпрд╣рд╛рдБ рдореЗрд░реЗ рдкреНрд░рд╢реНрди рд╣реИрдВред

  1. @ рд╕рдВрддрд░реА/рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ?
  2. рдЕрдЧрд░ 1 рд╕рддреНрдп рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? (рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдгреАрдп рддрд░реАрдХрд╛)
  3. рдпрджрд┐ 2 рдЧрд▓рдд рд╣реИ, рддреЛ рдХреНрдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдмреИрдХрдПрдВрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

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

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

@Taewa рдХреЛрдгреАрдп рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ SentryEvent рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ captureMessage(message: string) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред рдпрд╣реА рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдореИрдВрдиреЗ рднреА рдЪреБрдирд╛ рд╣реИ: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдВрддрд░реА рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрддрд░реА рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП captureEvent(event: SentryEvent) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ред рдореИрдВ

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

@Taewa рдХреЛрдгреАрдп рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ SentryEvent рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ captureMessage(message: string) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред рдпрд╣реА рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдореИрдВрдиреЗ рднреА рдЪреБрдирд╛ рд╣реИ: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдВрддрд░реА рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрддрд░реА рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП captureEvent(event: SentryEvent) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ред рдореИрдВ

рдзрдиреНрдпрд╡рд╛рдж @pascaliske
рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ captureMessage(message: string) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ред
рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ :)

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ рд╕реБрд▓рдЭрддрд╛ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

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

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

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

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

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

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

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