Sentry-javascript: Comment puis-je détecter l'erreur réseau du client via @sentry/browser ?

Créé le 19 déc. 2018  ·  3Commentaires  ·  Source: getsentry/sentry-javascript

Paquet + version

  • [o] @sentry/browser
  • [x] @sentry/node
  • [ ] raven-js
  • [x] raven-node _(corbeau pour nœud)_
  • [ ] autre : Angular6 + Ngrx6

Version:

@sentry/browser": "4.4.2"

La description

Salut tout le monde,
Comme je l'ai décrit ci-dessus, j'utilise Angular6 + Ngrx6.
Ce que je veux faire, c'est envoyer une erreur à Sentry lorsque webApp échoue à l'appel api.
Disons que j'appelle une API appelée /abc/3 qui n'existe pas.
Ensuite, le client obtient une erreur 404 Not Found .
Et c'est celui que je veux envoyer à Sentry via @sentry/browser .

J'ai créé un service simple.

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

et ont créé SentryErrorHandler qui étend les ErrorHandler d'Angular

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

Ce code détecte bien les erreurs js normales telles que
abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.

Cependant, j'ai compris que le code ci-dessus ne détecte pas d'erreur réseau. (Comme je l'ai dit /abc/3 )

J'ai donc créé ErrorInterceptor qui étend HttpInterceptor d'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);
                }
            })
        );
    }
}

Ensuite, je pourrais attraper l'erreur de réseau.
Mais le problème est que je n'en vois aucun dans mon tableau de bord Sentry.
J'ai vérifié mon onglet réseau Chrome. Et j'ai pu trouver un message :
"Exception sans erreur capturée avec des clés : erreur, en-têtes, message, nom, ok…"

Donc je suppose que @sentry/browser ne pense pas que ce soit une erreur.

J'ai aussi découvert que parler de Non-Error exception captured with keys: error, headers, message, name, ok…

Voici donc mes questions.

  1. @sentry/browser est censé détecter une erreur de réseau client ?
  2. Si 1 est vrai, comment puis-je le faire fonctionner ? (Espérons-le de manière angulaire)
  3. Si 2 est faux, l'erreur réseau doit-elle être gérée par le backend ?

Merci!

Commentaire le plus utile

@Taewa L'objet d'erreur lancé par Angular n'est pas au même format qu'un SentryEvent .

Une façon serait d'utiliser simplement le captureMessage(message: string) avec certaines des informations d'erreur. C'est aussi la manière la plus simple que j'ai choisie : https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

Une autre façon serait de créer vous-même un objet d'événement Sentry et d'utiliser la méthode captureEvent(event: SentryEvent) pour l'envoyer à Sentry.

J'espère que cela t'aides. 🙂

Tous les 3 commentaires

@Taewa L'objet d'erreur lancé par Angular n'est pas au même format qu'un SentryEvent .

Une façon serait d'utiliser simplement le captureMessage(message: string) avec certaines des informations d'erreur. C'est aussi la manière la plus simple que j'ai choisie : https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

Une autre façon serait de créer vous-même un objet d'événement Sentry et d'utiliser la méthode captureEvent(event: SentryEvent) pour l'envoyer à Sentry.

J'espère que cela t'aides. 🙂

Merci @pascaliske
En fait, j'ai résolu en utilisant captureMessage(message: string) que vous avez mentionné.
Ce serait utile pour les futurs visiteurs :)

Je ferme ce sujet car il semble être résolu.

Cette page vous a été utile?
0 / 5 - 0 notes