Sentry-javascript: @ sentry / browserを使用してクライアントのネットワークエラーを検出するにはどうすればよいですか?

作成日 2018年12月19日  ·  3コメント  ·  ソース: getsentry/sentry-javascript

  • [o]ドキュメントを確認します: https ://docs.sentry.io/
  • [o]既存の問題を検索します: https ://github.com/getsentry/sentry-javascript/issues
  • [o]最新のリリースを使用してください: https ://github.com/getsentry/sentry-javascript/releases

パッケージ+バージョン

  • [o] @sentry/browser
  • [x] @sentry/node
  • [] raven-js
  • [x] raven-node _(ノードのレイヴン)_
  • []その他:Angular6 + Ngrx6

バージョン:

@sentry/browser": "4.4.2"

説明

こんにちは、みんな、
上で説明したように、私はAngular6 + Ngrx6を使用しています。
私がやりたいのは、webAppがAPI呼び出しに失敗したときにSentryにエラーを送信することです。
たとえば、存在しない/abc/3というAPIを呼び出します。
次に、クライアントは404 Not Foundエラーを受け取ります。
そして、これは私が@sentry/browserを介してSentryに送信したいものです。

簡単なサービスを作成しました。

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

AngularのErrorHandler SentryErrorHandlerを作成しました

@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

そこで、AngularのHttpInterceptor ErrorInterceptorを作成しました。

@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のネットワークタブを確認しました。 そして私はメッセージを見つけることができました:
「キーでキャプチャされたエラー以外の例外:エラー、ヘッダー、メッセージ、名前、OK…」

したがって、@ sentry / browserはこれがエラーであるとは考えていないと思います。

私はまた、 Non-Error exception captured with keys: error, headers, message, name, ok…について話していることを知りまし

これが私の質問です。

  1. @ sentry / browserは、クライアントネットワークエラーをキャッチすることを目的としていますか?
  2. 1が真の場合、どうすればそれを機能させることができますか? (うまくいけばAngularの方法)
  3. 2がfalseの場合、ネットワークエラーはバックエンドで処理する必要がありますか?

ありがとう!

最も参考になるコメント

@Taewa Angularによってスローされたエラーオブジェクトは、 SentryEventと同じ形式ではありません。

1つの方法は、エラー情報の一部とともにcaptureMessage(message: string)を使用することです。 それは私が選んだより簡単な方法でもあります: https ://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

もう1つの方法は、Sentryイベントオブジェクトを自分で作成し、 captureEvent(event: SentryEvent)メソッドを使用してSentryに送信することです。

お役に立てれば。 🙂

全てのコメント3件

@Taewa Angularによってスローされたエラーオブジェクトは、 SentryEventと同じ形式ではありません。

1つの方法は、エラー情報の一部とともにcaptureMessage(message: string)を使用することです。 それは私が選んだより簡単な方法でもあります: https ://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

もう1つの方法は、Sentryイベントオブジェクトを自分で作成し、 captureEvent(event: SentryEvent)メソッドを使用してSentryに送信することです。

お役に立てれば。 🙂

ありがとう@pascaliske
私はあなたが言ったcaptureMessage(message: string)を使って実際に解決しました。
それは将来の訪問者のために役立つでしょう:)

解決されたようですので、この問題を閉じます。

このページは役に立ちましたか?
0 / 5 - 0 評価