Sentry-javascript: Как я могу обнаружить сетевую ошибку клиента через @sentry/browser?

Созданный на 19 дек. 2018  ·  3Комментарии  ·  Источник: getsentry/sentry-javascript

Пакет + версия

  • [о] @sentry/browser
  • [х] @sentry/node
  • [ ] raven-js
  • [x] raven-node _(ворон для узла)_
  • [ ] другое: Angular6 + Ngrx6

Версия:

@sentry/browser": "4.4.2"

Описание

Всем привет,
Как я описал выше, я использую Angular6 + Ngrx6.
Что я хочу сделать, так это отправить сообщение об ошибке в Sentry, когда веб-приложение терпит неудачу при вызове API.
Скажем, я вызываю API с именем /abc/3 , которого не существует.
Затем клиент получает ошибку 404 Not Found .
А это тот, который я хочу отправить в Sentry через @sentry/browser .

Я создал простой сервис.

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

и создали SentryErrorHandler , который расширяет ErrorHandler Angular.

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

Этот код хорошо обнаруживает обычную ошибку js, такую ​​как
abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.

Однако я понял, что приведенный выше код не обнаруживает сетевую ошибку. (Как я уже сказал /abc/3 )

Итак, я создал ErrorInterceptor , который расширяет HttpInterceptor Angular.

@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);
                }
            })
        );
    }
}

Тогда я мог поймать сетевую ошибку.
Но проблема в том, что я не вижу ничего на панели инструментов Sentry.
Я проверил вкладку сети Chrome. И я мог найти сообщение:
«Исключение без ошибок, захваченное ключами: ошибка, заголовки, сообщение, имя, ок…»

Так что я думаю, что @sentry/browser не считает это ошибкой.

Я также узнал, что речь идет о Non-Error exception captured with keys: error, headers, message, name, ok…

Итак, вот мои вопросы.

  1. @sentry/browser предназначен для обнаружения сетевой ошибки клиента?
  2. Если 1 верно, как я могу заставить его работать? (Надеюсь, угловой способ)
  3. Если 2 равно false, должна ли серверная часть обрабатывать сетевую ошибку?

Спасибо!

Самый полезный комментарий

@Taewa Объект ошибки, выдаваемый Angular, имеет другой формат, чем SentryEvent .

Одним из способов было бы просто использовать captureMessage(message: string) с некоторой информацией об ошибке. Я также выбрал более простой способ: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

Другой способ — создать объект события Sentry самостоятельно и использовать метод captureEvent(event: SentryEvent) для отправки его в Sentry.

Надеюсь это поможет. 🙂

Все 3 Комментарий

@Taewa Объект ошибки, выдаваемый Angular, имеет другой формат, чем SentryEvent .

Одним из способов было бы просто использовать captureMessage(message: string) с некоторой информацией об ошибке. Я также выбрал более простой способ: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

Другой способ — создать объект события Sentry самостоятельно и использовать метод captureEvent(event: SentryEvent) для отправки его в Sentry.

Надеюсь это поможет. 🙂

Спасибо @pascaliske
На самом деле я решил, используя captureMessage(message: string) , о котором вы упомянули.
Будущим посетителям будет полезно :)

Закрываю этот вопрос, так как он кажется решенным.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги