Sentry-javascript: كيف يمكنني اكتشاف خطأ شبكة العميل من خلال @ sentry / المتصفح؟

تم إنشاؤها على ١٩ ديسمبر ٢٠١٨  ·  3تعليقات  ·  مصدر: getsentry/sentry-javascript

الحزمة + الإصدار

  • [o] @sentry/browser
  • [x] @sentry/node
  • [] raven-js
  • [x] raven-node _ (غراب للعقدة) _
  • [] أخرى: Angular6 + Ngrx6

الإصدار:

@sentry/browser": "4.4.2"

وصف

أهلا بكم،
كما وصفت أعلاه ، أنا أستخدم Angular6 + Ngrx6.
ما أريد القيام به هو إرسال خطأ إلى Sentry عندما يفشل تطبيق الويب في استدعاء 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 الذي يمتد لـ Angular ErrorHandler

@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 والذي يمتد لـ Angular HttpInterceptor .

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

ثم يمكنني التقاط خطأ الشبكة.
لكن المشكلة هي أنني لا أستطيع رؤية أي منها في لوحة أجهزة القياس الخاصة بي.
لقد تحققت من علامة تبويب شبكة Chrome. ويمكنني أن أجد رسالة:
"تم تسجيل استثناء غير خطأ بواسطة المفاتيح: خطأ ، رؤوس ، رسالة ، اسم ، حسنًا ..."

لذلك أعتقد أن @ sentry / المتصفح لا يعتقد أن هذا خطأ.

اكتشفت أيضًا أن الحديث عن Non-Error exception captured with keys: error, headers, message, name, ok…

إذن ها هي أسئلتي.

  1. @ sentry / المتصفح من المفترض أن يصطاد خطأ شبكة العميل؟
  2. إذا كان الرقم 1 صحيحًا ، فكيف يمكنني أن أجعله يعمل؟ (نأمل طريقة الزاوية)
  3. إذا كان الرقم 2 خطأ ، فهل يجب معالجة خطأ الشبكة من خلال الخلفية؟

شكرا!

التعليق الأكثر فائدة

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.

أتمنى أن يساعدك هذا. 🙂

شكرا @ باسكاليسكي
لقد قمت بحلها بالفعل باستخدام captureMessage(message: string) الذي ذكرته.
سيكون مفيدًا للزوار في المستقبل :)

إغلاق هذه المشكلة حيث يبدو أنه تم حلها.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات