Sentry-javascript: كيفية تسجيل الاستثناءات ("captureException") للتحكم أيضًا

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

عندما أقوم بالتطوير محليًا ، أقوم بتعطيل إرسال الأخطاء إلى Sentry ولكن ما زلت أريد ظهور هذه الأخطاء في وحدة التحكم الخاصة بي حتى أتمكن من إصلاحها.

هل هناك طريقة لتعطيل إرسال الاستثناءات / الأحداث إلى Sentry ولكن لا يزال بإمكانك تسجيلها في وحدة التحكم؟

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

gaastonsr تفعل ذلك كوسيطة ثانية :) https://docs.sentry.io/learn/filtering/؟platform=browser#before -send

Sentry.init({
  dsn: "DSN",
  beforeSend: (event, hint) => {
   if (IS_DEBUG) {
     console.error(hint.originalException || hint.syntheticException);
     return null; // this drops the event and nothing will be sent to sentry
   }
   return event;
  }
});

ال 17 كومينتر

قمنا بلف captureException لهذا السبب:

function captureException(...args) {
    if (typeof Sentry !== 'undefined') {
        Sentry.captureException(...args);
    }
    else {
        console.error(...args);
    }
}

أود أن أقول إن أفضل طريقة هي استخدام beforeSend
شبيبة
Sentry.init ({
dsn: "DSN" ،
قبل الإرسال: الحدث => {
إذا (IS_DEBUG) {
وحدة التحكم (حدث) ؛
عودة فارغة ؛ // هذا يسقط الحدث ولن يتم إرسال أي شيء إلى الحارس
}
حدث العودة
}
}) ؛

ما لا يعجبني في استخدام beforeSend هو أنني لا أحصل على كائن الخطأ الأصلي. ولكن شكرا على الرد.

gaastonsr تفعل ذلك كوسيطة ثانية :) https://docs.sentry.io/learn/filtering/؟platform=browser#before -send

Sentry.init({
  dsn: "DSN",
  beforeSend: (event, hint) => {
   if (IS_DEBUG) {
     console.error(hint.originalException || hint.syntheticException);
     return null; // this drops the event and nothing will be sent to sentry
   }
   return event;
  }
});

يا إلهي ، هذا يغير كل شيء! شكرا ، kamilogorek.

استغرق الأمر مني 30 دقيقة لمعرفة سبب عدم تسجيل أخطاء وحدة التحكم الخاصة بي. يجب أن يكون هذا أسهل في القيام به.

تكمن المشكلة هنا في أنه إذا قمنا بتسجيله افتراضيًا ، فسنلتقطه أيضًا على أنه مسار تنقل افتراضيًا. ونحن نفعل هذا بالفعل لأخطاء الالتقاط. وبالتالي فإنه سينشئ إدخالات مكررة.
على الرغم من أن أذني مفتوحة بالكامل للتعليقات وإذا كان لدى أي شخص أي فكرة عن كيفية تحسين جزء المستندات هذا ، فسأكون أكثر من سعيد لتضمينه :)

تكمن المشكلة هنا في أنه إذا قمنا بتسجيله افتراضيًا ، فسنلتقطه أيضًا على أنه مسار تنقل افتراضيًا. ونحن نفعل هذا بالفعل لأخطاء الالتقاط. وبالتالي فإنه سينشئ إدخالات مكررة.
على الرغم من أن أذني مفتوحة بالكامل للتعليقات وإذا كان لدى أي شخص أي فكرة عن كيفية تحسين جزء المستندات هذا ، فسأكون أكثر من سعيد لتضمينه :)

إنه سلوك غير متوقع حقًا أن الحارس يكتشف الأخطاء ولا يظهرها في وحدة التحكم!
لقد أمضيت أيضًا ساعة في اكتشاف سبب عدم عمل تطبيقي على الرغم من أن وحدة التحكم واضحة.
هذا بالتأكيد يجب أن يتغير.

أعتقد أنه يمكنك تصفية الخطأ من مسار التنقل على جانب الخادم.
أو ربما قم بتسجيله في وحدة التحكم في رد الاتصال setTimeout ، لذلك سيتم التقاط فتات الخبز بالفعل. كما أفعل حاليًا:

Sentry.init({
  dsn: 'DSN',
  beforeSend: (event, hint) => {
    setTimeout(() => console.error(hint.originalException || hint.syntheticException), 0);
    return event;
  }
});

vitalets لقد تم تغييره في 5.9.0 . سترى أخطاء في وحدة التحكم الآن أيضًا.

vitalets لقد تم تغييره في 5.9.0 . سترى أخطاء في وحدة التحكم الآن أيضًا.

تضمين التغريدة
إنه لا يعمل بالنسبة لي على sentry/browser 5.9.1 (chrome 78، osx).
ها هو الكود:

Sentry.init({  dsn: 'dsn' });
setTimeout(() => {throw new Error('abc')}, 3000);

وحدة التحكم فارغة. توضح علامة التبويب "الشبكة" أنه تم إرسال الخطأ إلى الحارس.

يظهر بدون خطأ الحارس:

// Sentry.init({  dsn: 'dsn' });
setTimeout(() => {throw new Error('abc')}, 3000);

image

يسجل لـ CaptureException وليس لحدث الالتقاط:
لتسجيل captureEvent وcaptureException نحن معدلة بشكل طفيف فيkamilogorek الصورة الحل:

Sentry.init({
  dsn: "DSN",
  beforeSend: (event, hint) => {
   if (IS_DEBUG) {
     console.error(hint.originalException || hint.syntheticException || event);
     return null; // this drops the event and nothing will be sent to sentry
   }
   return event;
  }
});

kamilogorek هل هو الخيار الافتراضي لحزمة @sentry/node أيضًا؟ لدي الإصدار 5.9.0 وأرى يتم استدعاء الوظيفة beforeSend لكني لا أرى أي شيء مسجّل في وحدة التحكم.

لا أرى أي أخطاء في وحدة التحكم مع 5.10.1. سيكون التسجيل كافيًا إذا تم تعيين التصحيح على "صحيح".

هذا ما يحدث عندما لا تقرأ المواصفات حتى النهاية ...

https://html.spec.whatwg.org/multipage/webappapis.html#the -event-handler-Processing-algorithm

إذا كان خطأ خاص معالجة الحدث صحيحا
إذا كانت القيمة المرجعة صحيحة ، فقم بتعيين علامة إلغاء الحدث.
خلاف ذلك
إذا كانت القيمة المرجعة خاطئة ، فقم بتعيين علامة إلغاء الحدث.

ثم تقوم بالتمرير ...

هناك استثناءان في المنصة لأسباب تاريخية:
معالجات onerror في الكائنات العامة ، حيث يؤدي إرجاع true إلى إلغاء الحدث

سوف أقوم بتحديث الكود وفقًا لذلك

هذا ما يحدث عندما لا تقرأ المواصفات

لا أحد يقرأ المواصفات حتى النهاية :)

شكرا لك على الإصلاح!

إذا كنت أقرأ هذا الموضوع بشكل صحيح ، فيجب أن يُظهر الإصدار الحالي للحارس أخطاء في وحدة التحكم أثناء إرسالها أيضًا إلى لوحة معلومات الحارس. أنا لا أعاني من هذا السلوك.

إليك كيفية تحميل الحارس في صفحتي:

<script src="https://browser.sentry-cdn.com/5.20.1/bundle.min.js" integrity="sha384-O8HdAJg1h8RARFowXd2J/r5fIWuinSBtjhwQoPesfVILeXzGpJxvyY/77OaPPXUo" crossorigin="anonymous"></script>
<script src="https://browser.sentry-cdn.com/5.20.1/vue.min.js" crossorigin="anonymous"></script>

ها هي مكالمة التهيئة الخاصة بي:

  Sentry.init({
    dsn: 'https://_________.ingest.sentry.io/___________',
    integrations: [new Sentry.Integrations.Vue({Vue, attachProps: true})],
  });

لقد أضفت سطر إنتاج الخطأ التالي:

 window.undef.undef += 1;

عندما أقوم بتحميل الصفحة وتشغيل سطر الخطأ ، لا يظهر أي شيء في وحدة التحكم ، لكني أرى الخطأ في لوحة معلومات الحارس. إذا قمت بالتعليق على المكالمة Sentry.init فسوف أرى TypeError في وحدة التحكم js.

توقعت بناءً على قراءتي لهذا الموضوع أن أرى الخطأ في وحدة تحكم js أثناء تسجيله أيضًا في لوحة معلومات الحارس. أليس هذا صحيحا؟ هل ما زلت بحاجة إلى استخدام الخطاف beforeSend ؟

أدرك الآن أنني بحاجة إلى تمرير logErrors: true إلى المكالمة Integrations.Vue :

new Sentry.Integrations.Vue({Vue, attachProps: true, logErrors: true}

عذرًا ، كان يجب أن أقرأ المستندات عن كثب!

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