Skip to main content
خلف الكواليس
خلف الكواليسEngineeringDecisions

مراقبة 4000 سيرفر Discord: Grafana وPostHog وما أظهراه لنا

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

نُشر في بواسطة AlphaCloud4 دقائق قراءة

يعمل AlphaCloud على ما يزيد قليلًا على 4000 سيرفر Discord، موزعة على أربعة Shards. وهي أربع عمليات، تخدم كل منها جزءًا من السيرفرات، وكلها تتحدث مع الواجهة البرمجية (API) نفسها.

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

أداتان، وسؤالان

Grafana يجيب عن السؤال: ماذا يفعل البوت؟ يرسل البوت والـ API مقاييس إلى Prometheus (الطلبات، وأوقات الاستجابة، ونسب الأخطاء، وردود Discord، واستخدام الذكاء الاصطناعي)، وتذهب السجلات إلى Loki. لكل عقدة خادم مجموعتها الخاصة، ولا يمكن الوصول إلى Grafana إلا عبر شبكة خاصة، لا من الإنترنت.

PostHog يجيب عن السؤال: ماذا يختبر الناس على مواقعنا؟ مشاهدات الصفحات، وأخطاء المتصفح، وأوقات التحميل، ومع الموافقة، الجلسات المسجّلة. لا يبدأ PostHog إلا بعد موافقتك في شريط ملفات تعريف الارتباط.

هذا الفصل مقصود. Grafana ينظر إلى الآلات، وPostHog إلى الواجهات. ومن يحشر الاثنين في أداة واحدة، ينتهي إما ببيانات المستخدمين في سجلات الخادم، أو بحِمل الخادم في تحليلات المنتج.

ما الذي وجدته

حلقة أنتجت نصف حركة البيانات

الاستطلاعات التي لها وقت انتهاء تُغلقها مهمة في الخلفية تتحقق كل دقيقة مما إذا كان شيء قد انتهى. وكانت تفعل ذلك لـ كل سيرفر على حدة. مع نحو 1000 سيرفر لكل Shard وأربعة Shards، بلغ ذلك نحو 70 طلبًا في الثانية، وكانت إجابة كلها تقريبًا «لم ينتهِ شيء».

لم نلاحظ ذلك إلا في Grafana، عندما قسّمنا طلبات البوت إلى الـ API حسب المسار: هذه النقطة وحدها كانت أكثر من نصف حركة البيانات كلها. كل شيء كان يعمل. لكنه كان يحمل حِملًا لم يطلبه أحد.

الآن يسأل كل Shard مرة واحدة في الدقيقة: «أي السيرفرات لديها استطلاع منتهٍ أصلًا؟» ولا يجلب التفاصيل إلا لتلك السيرفرات. نحو 4200 طلب في الدقيقة أصبحت نحو أربعة.

ثلاثة ملايين مرة «غير مُعدّ»

النمط نفسه في مكان آخر: عدة وحدات (سجلات الدعم، والغيابات، وقائمة الفريق، وإحصائيات البوت، والنشرة البريدية) كانت تقرأ إعدادات كل سيرفر بانتظام في حلقاتها. وعلى معظم السيرفرات تكون الوحدة المعنية غير مُعدّة أصلًا، فكانت الإجابة «غير موجود». نحو ثلاثة ملايين مرة يوميًا.

الإصلاح غير مثير: أصبحت حالة «غير مُعدّ» تُحفظ في الذاكرة لمدة 30 دقيقة. وهذا آمن فقط لأن كل وحدة من هذه الوحدات ترسل إلى البوت تحديثًا لحظة حفظها في لوحة التحكم، فإعداد وحدة لا يعني أبدًا الانتظار 30 دقيقة.

أعطال Discord ليست أخطاءنا

كانت قناة الأخطاء الخاصة بفريقنا تنشر كل إجراء فاشل كـ «Runtime Error»، مع مرجع فريد وكل شيء. وشمل ذلك اللحظات التي ردّ فيها Discord نفسه بخطأ في الخادم. وهذا ليس خطأً من جانبنا ولا شيئًا يمكننا إصلاحه، ومع ذلك كان يظهر في القناة تمامًا كعيب حقيقي.

اليوم يُسجَّل ذلك كتحذير، ويُطلب من العضو المحاولة مجددًا بعد ثوانٍ قليلة بدلًا من أن يُعرض عليه رابط لتقديم بلاغ عن خطأ. قناة أخطاء نصف رسائلها ليست أخطاءً تتوقف في النهاية عن أن تُقرأ. وحينها يفوتك الخطأ الحقيقي.

هجوم استمر دقيقة واحدة

في عصر أحد الأيام في نهاية سبتمبر، تلقت صفحتنا الرئيسية ما يزيد قليلًا على 500,000 طلب خلال دقيقة واحدة، من دول كثيرة في الوقت نفسه. أُوقف معظمها قبل أن يصل إلى خوادمنا، وبعد دقيقة عادت الحركة إلى طبيعتها.

لم نرَ ذلك لأن شيئًا ما تعطّل. رأيناه لأن الرقم لم يتناسب مع بقية الرسم البياني. وهذه هي المهمة الفعلية للمراقبة: ليس إطلاق الإنذار حين يشتعل كل شيء، بل إظهار المواضع التي لا يتناسب فيها شيء مع الوضع الطبيعي.

ما لا تراه مراقبتنا عمدًا

القواعد هنا مهمة بقدر لوحات المعلومات:

  • لا عناوين IP للزوار في السجلات. سياسة الخصوصية لدينا تعد بذلك، لذا نزيلها في موضعين: عند كتابة سجل الوصول، ومرة أخرى قبل تخزينه.
  • لا معرّفات سيرفرات أو مستخدمين أو رسائل في المقاييس. كل مقياس لا يُقسَّم إلا حسب سمات عامة (الوحدة، وفئة الحالة، والـ Shard). وهذا يحمي البيانات ويبقي قاعدة بيانات المقاييس صغيرة.
  • تسجيلات الجلسات تُظهر واجهتنا، لا محتواك. وحده النص الذي يأتي حرفيًا من ملفات الترجمة لدينا يبقى مقروءًا. أسماء السيرفرات والقنوات والمستخدمين، والمدخلات، والمعاينات تُخفى. وإذا تعذّر تحميل قائمة النصوص المسموح بها، يُخفى كل شيء.
  • كل شيء على الموقع لا يعمل إلا بعد الموافقة. وهذا يجعل الأرقام هناك حدًا أدنى أيضًا. للحصول على أعداد الصفحات الحقيقية، ننظر إلى الإجماليات المجهولة الهوية من مزوّد الشبكة لدينا.

التفاصيل في سياسة الخصوصية.

ما الذي نستخلصه

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

السؤال لكل سيرفر على حدة لا يتوسع. كانت النتيجتان الكبيرتان النمط نفسه: حلقة على كل السيرفرات تسأل عن كل واحد منها بمفرده. والحل في أغلب الأحيان هو السؤال نفسه، يُطرح مرة واحدة عنها جميعًا.

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

إذا كنت تدير سيرفر Discord بنفسك وتريد رؤية الوحدات المذكورة هنا: الاستطلاعات وسجلات الدعم والغيابات موجودة في لوحة التحكم، وهي موصوفة في التوثيق.

مقالات أخرى