Sentry-javascript: لم يتم العثور على شفرة المصدر لـ index.js

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

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

  • [] @sentry/browser
  • [x] @sentry/node
  • [] raven-js
  • [] raven-node _ (غراب للعقدة) _
  • [ ] آخر:

الإصدار:

4.4.1

وصف

سينتج عن رمز التقاط الحدث التالي خطأ في Sentry أثناء تحليل الحدث: Source code was not found for /.../index.js

const Sentry = require('@sentry/node');

Sentry.init({ dsn: 'https://5d29[...][email protected]/13[...]6' });

(async () => {
  const sentryEvent = await Sentry.Parsers.parseError(new Error('Test'));
  Sentry.captureEvent(sentryEvent);
})();

إليك كيف يبدو الحدث في Sentry:
Sentry Event Screenshot

Needs Information

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

حسنًا ، هذا يبدو لي وكأنه خطأ في UX. في رأيي ، يجب أن يكون (على الأقل لمشاريع Node.js) تحذيرًا فقط ويجب ألا يقول Source code was not found ولكن شيء مثل Source maps were not found . كان هذا من شأنه أن يمنع حدوث مشكلة لها تاريخ لأكثر من عام ؛)
إذا كنت تريد ، يمكنك إعادة فتح هذه المشكلة كتقرير لمن يعمل في الواجهة الأمامية / جزء العرض ، أو اتركه مغلقًا وأبلغهم بسوء الفهم هذا. شكرا جزيلا لتوضيح هذا أخيرا!

ال 28 كومينتر

هل يمكنك نشر رابط مباشر للحدث؟

(لقد فاتتك أيضًا بعض المسارات في لقطة شاشة تتبع المكدس التي قمت بإخفائها مسبقًا 😅)

هل هناك أي سبب محدد لعدم استخدامك Sentry.captureException مباشرةً ، ولكنك تريد بدلاً من ذلك إنشاء الحدث الخاص بك؟

نعم ، هذا هو الحدث: https://sentry.io/share/issue/e2c8d20b66d2406cb32c540d87654b4a/ (تم تعديله قليلاً لعدم نشر رقم dsn الخاص بنا)

السبب ، لماذا أستخدم Sentry.captureEvent() هو ما يلي: أنا أحتفظ بمكوِّن إضافي hapi -sentry ./index.js#L41-L67

guischdi السبب في حصولك على هذا الخطأ هو أن مسارات الملفات المحلية لا يمكن الوصول إليها من خلال الخوادم البعيدة.
يحاول Sentry جلب وحل /something/local/src/app.js وقراءة الكود المصدري منه لتقديم تعيينات أخطاء أفضل (يعمل بنفس الطريقة مع ملفات sourcemap).

لتحميل ملفاتك ، يمكنك استخدام CLI https://docs.sentry.io/cli/ أو المكون الإضافي Webpack https://github.com/getsentry/sentry-webpack-plugin

فيما يلي بعض المستندات القديمة على خرائط المصدر ، ولكن المفهوم هو نفسه لـ SDK الجديد https://docs.sentry.io/clients/node/sourcemaps/ (كل هذا ينطبق بنفس الطريقة على مشكلتك الحالية).

هناك أيضًا تكامل موجود يمكنك استخدامه لإعادة كتابة المسارات في كل إطار https://github.com/getsentry/sentry-javascript/blob/master/packages/core/src/integrations/pluggable/rewriteframes.ts

لذلك على سبيل المثال:

Sentry.init({
  dsn: "https://[email protected]/297378",
  integrations: [new Sentry.Integrations.RewriteFrames()]
});

سيتم تغيير /something/local/src/app.js إلى app:///app.js ( app:/// هي بادئتنا الداخلية) ، لذلك عندما تقوم بتحميل app.js إلى عناصر إصدار الحارس ، ستتم قراءته بشكل صحيح بدون حاجة لجلب الملفات الخارجية.

ما عليك القيام به في الأساس هو:

  • تعيين release في init مكالمة
  • قم بتحميل مصادرك إلى نفس الإصدار في تطبيق Sentry
  • تأكد من أن الإطارات في الأخطاء التي تكتشفها تتوافق مع الإطارات الموجودة في ملفات التحميل

أتمنى أن يوضح لك بعض الأشياء. لا تتردد في طلب أي شيء إذا كنت بحاجة إلى مزيد من المساعدة.

مرحباkamilogorek
شكرا لجوابك المفصل.

هل فهمت الأمر بشكل صحيح: الطريقة الشائعة للحصول على تتبع مكدس لتطبيق Node.js يظهر في Sentry هو تحميل ملفات كل إصدار عبر تكامل RewriteFrames أو يدويًا؟ إذا كان الأمر كذلك ، فكيف يتم عرض تتبع المكدس على captureException / catch-all ولا يتم تشغيل أي خطأ "لم يتم العثور على رمز المصدر".

لقد اختبرت كيفية إلقاء خطأ في node_modules lib. يتم الإبلاغ عن الخطأ بشكل صحيح بما في ذلك شفرة المصدر حتى من lib. انظر https://sentry.io/share/issue/2b95ecb13ce24227b2184b2561e4f6e3/

فلماذا يعمل هذا مع captureException ويفشل مع captureEvent ؟

Sentry Screenshot

guischdi هل يمكنك تجاوز الارتباط الكامل لكلا الحدثين؟ لا يمكن مشاركتها؟ يمكنني الوصول إليهم من خلال أذونات المسؤول.

أيضًا ، سأكون خارج المكتب لمدة 3 أسابيع قادمة ، لذا سأحاول العودة إلى هذا عندما أعود.

تضمين التغريدة

  • هذا هو الرابط captureEvent
  • هذا هو الرابط captureException

شكرا لإلقاء نظرة على هذا!

kamilogorek هل تقصد أنني بحاجة إلى تحميل مجلد node_modules بالكامل لكل إصدار أيضًا؟ لماذا @sentry/node عند التشغيل على الخادم وتوافر كل هذه المصادر ولا يمكنك تحميل الملفات المطلوبة بتقرير الخطأ؟

أؤكد أنه بعد تعيين تكامل الإطارات وتحميل node_modules بالكامل يحل هذه المشكلة بالنسبة لي. لكن عملية تحميل الكثير من ملفات node_modules بطيئة للغاية.

أعتقد أن الحل لهذا هو إما:

  1. السماح بواسطة الحارس بتحميل .tar من الإصدار بالكامل
  2. تجميع مشروع العقدة إلى .js و .map ونشر وتحميل هذين الملفين فقط.

أيضًا ، كنت أواجه مشكلة في خرائط المصدر التي أشارت إلى الملف الأصلي .ts الذي لم يكن في حزمة node_modules npm - https://github.com/prisma/graphql-middleware/issues/159

kamilogorek هل من أخبار عن هذا الموضوع؟

يمكنني أيضًا أن أؤكد أن إعادة كتابة الإطارات كان الحل بالنسبة لنا.

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

لقد أضفنا للتو new Integrations.RewriteFrames() إلى مفتاح عمليات الدمج إلى Sentry's init ، وبدأ اختيار خرائط المصادر لكل إصدار جديد.

من الجيد معرفة أن تكامل RewriteFrames وتحميل node_modules يبدو أنه يحل المشكلة. لكن أولاً (كما ذكر @ mieszko4 بالفعل) ، فإن تحميل العديد من الملفات أمر مزعج للغاية. علاوة على ذلك ، كان اكتشافي الأولي ،

يتم عرض تتبع المكدس على captureException / catch-all ولا يتم تشغيل أي خطأ "لم يتم العثور على رمز المصدر"

لذلك يبقى السؤال التالي مفتوحًا:

فلماذا يعمل هذا مع captureException ويفشل مع captureEvent ؟

أو بتعبير أدق: يمكن للمرء ببساطة التقاط خطأ عبر captureException بدون مشاكل ، ولكن من أجل الالتقاط عبر captureEvent يلزم تحميل جميع الملفات ( RewriteFrames أو التكامل يدويًا) لمنع خطأ "لم يتم العثور على رمز المصدر". هل هذا خطأ أم مقصود ،kamilogorek؟

guischdi آسف لمثل هذا الرد المتأخر. لقد فقدت المسار قليلا. هل يمكنك تحديث ذاكرتي بما يحدث هنا وتقديم بعض نماذج الأحداث؟

تضمين التغريدة
نعم مشكلتنا هي:

  • captureException يعمل بشكل جيد ، حتى لو ألقى node_module خطأ ؛ رؤية استثناء الاختبار هذا
  • captureEvent أعط الحراس: error encountered while processing this event: [...] Source code was not found ؛ انظر هذا الاختبار

guischdi فقط للتأكيد ، هذا هو ملف العقدة الخام js أليس كذلك؟ لا حزمة ويب ولا تجميع ولا خرائط مصدر. ملف واحد فقط index.js مع مكالمتين مختلفتين على خطوط مختلفة؟ هل يمكنك تقديم محتوى هذا الملف إن أمكن؟

تضمين التغريدة
نعم ، خام العقدة JS. ألق نظرة على المشكلة الثانية التي ربطتها أعلاه . تشاهد بالفعل جميع الأسطر الـ 13 الخاصة بـ index.js هناك.

guischdi نحن نحقق في سبب https://sentry.io/settings/kamil-ogorek/projects/testing-project/
إنه تطبيق عقدة ، لذلك لا فائدة من القيام بذلك.

kamilogorek حسنًا ، لقد أوقفت إعداد "تمكين جلب مصدر جافا سكريبت" 1 error encountered while processing this event: [...] Source code was not found (راجع هذه المشكلة )

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

kamilogorek أي أخبار عن هذا؟

بالنسبة لي ، يشير عرض المشكلة إلى أن الكود المصدري ينقصه بعض الملفات ، لكنها كلها موجودة ويمكن عرضها ضمن تتبع المكدس.

أنا أدير تطبيق Sentry مستضافًا ذاتيًا وأستخدم @sentry/node 5.4.3

ها هي الكود الخاص بي:

// file: <path>/code/cli
const Sentry = require('@sentry/node');
Sentry.init({ dsn: process.env.SENTRY_DSN });
function test () {
  throw new Error('test');
}
test();

أتلقى هذا الخطأ أيضًا:

image

وهنا المكدس:

Error: test
  File "<path>/code/cli", line 10, col 9, in test
    throw new Error('test');
  File "<path>/code/cli", line 13, col 1, in Object.<anonymous>
    test();
  File "internal/modules/cjs/loader.js", line 1063, col 30, in Module._compile
  File "internal/modules/cjs/loader.js", line 1103, col 10, in Module._extensions..js
  File "internal/modules/cjs/loader.js", line 914, col 32, in Module.load
  File "internal/modules/cjs/loader.js", line 822, col 14, in Module._load
  File "internal/modules/cjs/loader.js", line 1143, col 12, in Module.runMain
  File "internal/main/run_main_module.js", line 16, col 11, in null.<anonymous>

أنا أيضًا أواجه هذه المشكلة Source code was not found

LukeXF هل يمكنك توفير رابط لحدث متأثر؟

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

هذا خطأ من جانبنا ، لأننا في الواقع لا نتوقع منك تحميل node_modules مع كل إصدار (لتطبيقات العقدة ؛ لتطبيقات المتصفح ، من المحتمل أن تقوم بتجميع / تصغير على أي حال). يجب إصلاحه عن طريق https://github.com/getsentry/sentry/pull/17538 ، والتي سيتم نشرها في غضون ساعات قليلة.

بمجرد وصول هذا الإصلاح ، هل يمكن لأي شخص قام بالتعليق هنا أن يخبرنا إذا كان لا يزال لديك مشاكل / أسئلة ، وما هي؟ يسعدني إعادة فتح هذا إذا لزم الأمر.

مرحباlobsterkatie
اختبرته مرة أخرى ، باستخدام المقتطف التالي (تم تجريده من الملف التمهيدي الحالي على npm):

const Sentry = require('@sentry/node');

Sentry.init({ dsn: process.env.DSN });

(async () => {
  Sentry.captureException(new Error('Good bye'));
})();

لسوء الحظ ، ما زلنا نحصل على خطأ Source code was not found على https://sentry.io/share/issue/0247fe07741c4e358089461f113cef42/
هل الإصلاح الذي قدمته بالأمس منتشر بالفعل؟

تم الاختبار أيضًا باستخدام الإصدار v4.xx الحالي (v4.6.6) والإصدار الأخير (v5.14.0) من @ sentry / node.

guischdi لم تقم بتحميل أي عناصر أثرية ، ولم تقم بتضمين إصدار في التكوين الخاص بك.

يرجى اتباع المستندات أولاً: https://docs.sentry.io/platforms/node/sourcemaps/

تضمين التغريدة

في SDK ، قبل أن نرسل الحدث ، نسجل هذه المعلومات كجزء من معالجة stacktrace. يأتي الخطأ من الخادم الذي يحاول أيضًا ملء تلك المعلومات.
هذا خطأ من جانبنا ، لأننا في الواقع لا نتوقع منك تحميل node_modules مع كل إصدار

إذا فهمت lobsterkatie في هذه النقطة (المقتبسة أعلاه) ، فلن أحتاج إلى تحميل الكود. في رابط المشكلة ، يمكنك رؤية كل سياق التعليمات البرمجية المصدر المطلوب لفهم المشكلة (في هذه الحالة ، كل التعليمات البرمجية المصدر للنص البرمجي). لذلك يبدو أن هذا تم تسجيله بشكل صحيح. لا أعتقد أنني بحاجة إلى تحميل / تقديم خرائط المصادر (كما يقترح الرابط الخاص بك) ، لأنه برنامج Node.js عادي غير مصغر.
أعتقد أن المشكلة الوحيدة المتبقية هي الخطأ الذي يتم عرضه على الرغم من عدم توفير السياق بشكل صحيح. يبدو أن الخادم لا يدرك أنه لا يحتاج إلى تحميلات إضافية من جانبي. (هل أفهم ذلك بشكل صحيح @ lobsterkatie ؟)

guischdi الملف الذي تبحث عنه من تطبيقك ، وليس من node_modules ، لذا لن يتم تطبيق التغيير الذي أجريته (لاستبعاد رمز الجهة الخارجية بنجاح أكبر) هنا.

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

حسنًا ، هذا يبدو لي وكأنه خطأ في UX. في رأيي ، يجب أن يكون (على الأقل لمشاريع Node.js) تحذيرًا فقط ويجب ألا يقول Source code was not found ولكن شيء مثل Source maps were not found . كان هذا من شأنه أن يمنع حدوث مشكلة لها تاريخ لأكثر من عام ؛)
إذا كنت تريد ، يمكنك إعادة فتح هذه المشكلة كتقرير لمن يعمل في الواجهة الأمامية / جزء العرض ، أو اتركه مغلقًا وأبلغهم بسوء الفهم هذا. شكرا جزيلا لتوضيح هذا أخيرا!

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