@sentry/browser
@sentry/node
raven-js
raven-node
_(ворон для узла)_@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…
Итак, вот мои вопросы.
Спасибо!
@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)
, о котором вы упомянули.
Будущим посетителям будет полезно :)
Закрываю этот вопрос, так как он кажется решенным.
Самый полезный комментарий
@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.Надеюсь это поможет. 🙂