Запретить Sentry.io регистрировать коды ошибок сервера - PullRequest
0 голосов
/ 07 мая 2020

У меня есть приложение Angular, использующее Sentry.io для ведения журнала. Я создал собственный класс обработчика ошибок, в котором я инициализирую Sentry, и я хотел бы избежать ошибок сервера журнала (404 Not Found или 500 Server Error).

Я прочитал, что если сетевой вызов завершается неудачно в Angular, исключение всплывает и не улавливается в ErrorHandler (следовательно, не запускается метод handleError).

Однако, даже если я использую метод beforeSend(), как было предложено в этом конкретном случае c, журналы консоли записываются (например, SENTRY SKIPPING EVENT), но все ошибки сервера продолжают регистрироваться в Sentry.

export class MyhErrorHandler implements ErrorHandler {

    if (environment.production) {

      Sentry.init({
        dsn: 'https://12314567@sentry.io/123456789',
        environment: this.environmentData.env,
        beforeSend(event) {
          try {
            if (this.isServerError(JSON.stringify(event))) {
              console.log('------   SENTRY SKIPPING EVENT: ', {event});
              return null;
            }
          } catch (e) {
            console.log('------   SENTRY ERROR: ', {e});
          }
          return event;
        }
      });
    }

   handleError(err: any): void {
     if (!this.isServerError(err)) {    
       const errorText = MyhErrorHandler.getError(err);
       Sentry.captureException(errorText);
     }
   }

  private isServerError(error: any): boolean {
    if (!error) {
      return false;
    }

    const regex = new RegExp(
      `500 Internal Server Error|401 Unauthorized|403 Forbidden|404 Not Found|502 Bad Gateway|503 Service Unavailable`,
      'mi'
    );

      return regex.test(JSON.stringify(error);
    } catch (error) {
      Sentry.captureException(`Error in myh-error-handler while parsing error Obj: ${errorText} -- ${error.message}`);
    }
  }
}

1 Ответ

1 голос
/ 07 мая 2020

Я нашел решение своей проблемы и пишу его здесь, чтобы оно могло помочь другим.

Я использовал свойство ignoreErrors, принимая строку или RegEx во время инициализации Sentry:

const serverErrorsRegex = new RegExp(
      `500 Internal Server Error|401 Unauthorized|403 Forbidden|404 Not Found|502 Bad Gateway|503 Service Unavailable`,
      'mi'
    );

 Sentry.init({
        dsn: 'https://123456@sentry.io/12345678',
        environment: this.environmentData.env,

        // We ignore Server Errors. We have to define here since Angular 
        // http client uses setTimeout to detect http call progress.
        // And when the call fails, it throws an exception inside that timeout 
        // that bubbles up higher to the main Angular's error handler.
        ignoreErrors: [serverErrorsRegex]
      });

В Regex я использовал флаги mi, обозначающие:

  • 'm': многострочный режим
  • 'i': без учета регистра

Подробнее о флагах Regex здесь .

...