Sentry-javascript: Wie kann ich den Netzwerkfehler des Clients über @sentry/browser erkennen?

Erstellt am 19. Dez. 2018  ·  3Kommentare  ·  Quelle: getsentry/sentry-javascript

Paket + Version

  • [o] @sentry/browser
  • [x] @sentry/node
  • [ ] raven-js
  • [x] raven-node _(Rabe für Knoten)_
  • [ ] andere: Angular6 + Ngrx6

Ausführung:

@sentry/browser": "4.4.2"

Beschreibung

Hallo zusammen,
Wie ich oben beschrieben habe, verwende ich Angular6 + Ngrx6.
Was ich tun möchte, ist, dass ein Fehler an Sentry gesendet wird, wenn webApp den API-Aufruf fehlschlägt.
Nehmen wir an, ich rufe eine API namens /abc/3 , die nicht existiert.
Dann erhält der Client einen 404 Not Found Fehler.
Und das ist derjenige, den ich über @sentry/browser an Sentry senden möchte.

Ich habe einen einfachen Dienst erstellt.

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

und haben SentryErrorHandler erstellt, das ErrorHandler Angular erweitert

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

Dieser Code erkennt gut normale js-Fehler wie z
abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.

Ich habe jedoch herausgefunden, dass der obige Code keinen Netzwerkfehler erkennt. (Wie ich schon sagte /abc/3 )

Also habe ich ErrorInterceptor erstellt, das HttpInterceptor Angular erweitert.

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

Dann könnte ich den Netzwerkfehler abfangen.
Aber das Problem ist, dass ich in meinem Sentry-Dashboard keine sehen kann.
Ich habe meinen Chrome-Netzwerk-Tab überprüft. Und ich konnte eine Nachricht finden:
"Non-Error-Ausnahme mit Schlüsseln erfasst: Fehler, Header, Nachricht, Name, ok ..."

Also denke ich, dass @sentry/browser dies nicht für einen Fehler hält.

Ich habe auch herausgefunden , dass über Non-Error exception captured with keys: error, headers, message, name, ok… gesprochen wird

Hier also meine Fragen.

  1. @sentry/browser soll Client-Netzwerkfehler abfangen?
  2. Wenn 1 wahr ist, wie kann ich es zum Laufen bringen? (Hoffentlich eckiger Weg)
  3. Wenn 2 falsch ist, sollte der Netzwerkfehler vom Back-End behandelt werden?

Danke!

Hilfreichster Kommentar

@Taewa Das von Angular ausgelöste Fehlerobjekt hat nicht das gleiche Format wie ein SentryEvent .

Eine Möglichkeit wäre, einfach captureMessage(message: string) mit einigen der Fehlerinformationen zu verwenden. Das ist auch der einfachere Weg, den ich gewählt habe: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

Eine andere Möglichkeit wäre, selbst ein Sentry-Ereignisobjekt zu erstellen und die captureEvent(event: SentryEvent) -Methode zu verwenden, um es an Sentry zu senden.

Hoffe das hilft. 🙂

Alle 3 Kommentare

@Taewa Das von Angular ausgelöste Fehlerobjekt hat nicht das gleiche Format wie ein SentryEvent .

Eine Möglichkeit wäre, einfach captureMessage(message: string) mit einigen der Fehlerinformationen zu verwenden. Das ist auch der einfachere Weg, den ich gewählt habe: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts

Eine andere Möglichkeit wäre, selbst ein Sentry-Ereignisobjekt zu erstellen und die captureEvent(event: SentryEvent) -Methode zu verwenden, um es an Sentry zu senden.

Hoffe das hilft. 🙂

Danke @pascaliske
Ich habe es tatsächlich gelöst, indem ich captureMessage(message: string) verwendet habe, das Sie erwähnt haben.
Es wäre hilfreich für die zukünftigen Besucher :)

Dieses Problem wird geschlossen, da es anscheinend behoben ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen