جودة الإنتاج والمراقبة

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

مثال ذلك متجر إلكتروني يعدّ طلبات الشراء التي تصله وعدد ما يفشل منها. فإذا قفزت نسبة الإخفاقات من ⁦0.2%⁩ إلى ⁦3%⁩ بعد إصدار جديد مباشرةً، وصل تنبيه إلى المطوّر المناوب، فيفتح السجلات ومسار طلب واحد فاشل، ويرى أي خدمة تسببت في المشكلة.

لماذا يهم

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

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

جودة الإنتاج كأهداف متفق عليها

عرّفك درس الإزاحة لليسار والإزاحة لليمين بالإشارات الذهبية الأربع. وللحكم على جودة الإنتاج حوّلها إلى أهداف. يستخدم كتاب «هندسة موثوقية المواقع» (Site Reliability Engineering, SRE) من Google ثلاثة مصطلحات: مؤشر مستوى الخدمة (SLI) مقياس معرَّف بدقة للخدمة كما يتلقاها المستخدمون، مثل نسبة طلبات الشراء التي تنجح خلال ثانيتين. وهدف مستوى الخدمة (SLO) هو القيمة المستهدفة لهذا المؤشر، مثل ⁦99.5%⁩ على مدى ⁦30⁩ يوماً. واتفاقية مستوى الخدمة (SLA) عقد مع العملاء يحدد عواقب عدم تحقيق الأهداف، مثل استرداد جزء من المبلغ.

ويحدد هدف مستوى الخدمة أيضاً ميزانية الخطأ (Error Budget): مقدار الإخفاق الذي يسمح به، أي ⁦100%⁩ ناقص الهدف. فعند ⁦99.5%⁩ ونحو ⁦200,000⁩ طلب شراء في الشهر، تبلغ الميزانية نحو ⁦1,000⁩ طلب فاشل أو بطيء. وفي النهج الذي يصفه كتاب SRE، يوقف الفريق الذي استنفد ميزانيته الإصدارات مؤقتاً ويستثمر في الموثوقية والاختبار، فيتحول سؤال «هل الإنتاج بخير؟» إلى رقم اتفق عليه الجميع.

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

جرّبها: محلّل زمن الاستجابة

خمسة أنواع من إشارات المراقبة

يقول كتاب SRE إن على المراقبة أن تجيب عن سؤالين: ما الذي تعطّل، ولماذا؟ ومراقبة الصندوق الأبيض (White-box) تعتمد على ما يسجّله النظام عن نفسه، ومراقبة الصندوق الأسود (Black-box) تختبر السلوك من الخارج كما يراه المستخدم. ويجيب كل نوع من الإشارات عن سؤال مختلف، وتعمل الأنواع معاً كسلسلة: العَرَض يُطلق التنبيه، والتفاصيل تقود إلى السبب.

  • المقاييس (Metrics): أرقام عبر الزمن، مثل عدد الطلبات في الدقيقة ومعدل الأخطاء وزمن الاستجابة p95 (الزمن الذي تنتهي خلاله ⁦95%⁩ من الطلبات) وعدد الطلبات في الساعة. وحفظها شهوراً قليل التكلفة، وهي تُظهر الاتجاهات والتغيرات المفاجئة، لكنها لا تقول أي مستخدم تأثر ولا لماذا.
  • السجلات (Logs): قيود مؤرَّخة بالوقت لأحداث مفردة. والسجلات المهيكلة، أي كائن JSON واحد في كل سطر بحقول مثل الوقت والمستوى والخدمة ونقطة النهاية (Route) ومعرّف الطلب، يمكن تصفيتها. اكتب الأوقات بتوقيت UTC، لتُقارَن أحداث الخوادم الموجودة في مناطق زمنية مختلفة. وكما توصي ورقة OWASP المرجعية للتسجيل (Logging Cheat Sheet)، لا تسجّل في السجلات كلمات المرور أو معرّفات الجلسات أو رموز الوصول أو بيانات البطاقات أو البيانات الشخصية الحساسة.
  • مسارات الطلبات (Traces): الطريق الذي يقطعه طلب واحد عبر كل خدمة يمرّ بها، في صورة خطوات متداخلة موقوتة تُسمّى المقاطع (Spans). يُظهر المسار أين ذهب الوقت وأي استدعاء فشل. وتمرّر الخدمات معرّف المسار في ترويسة الطلب (يسمّيها معيار W3C Trace Context باسم traceparent)، وكتابة المعرّف نفسه في السجلات تربط بين الاثنين.
  • التنبيهات (Alerts): قواعد تراقب الإشارات وتُبلغ شخصاً. والتنبيه العاجل الذي يصل إلى الشخص المناوب (On-call)، أي من يتولّى الرد على التنبيهات في تلك النوبة، يُسمّى استدعاءً (Page). استدعِ المناوب عند أعراض يشعر بها المستخدمون، مثل انخفاض مؤشر مستوى الخدمة، لا عند كل سبب محتمل؛ وكل استدعاء ينبغي أن يتطلب تصرفاً عاجلاً يحتاج إلى تفكير، وكثير من الفرق تربطه بدليل تشغيل (Runbook) يكتب خطوات التعامل معه. أما المشكلات الأقل إلحاحاً فتصبح تذاكر. وكثرة الاستدعاءات تعلّم الناس تجاهلها.
  • الفحوص الاصطناعية (Synthetic Checks): رحلات مكتوبة تُشغَّل من خارج النظام كل بضع دقائق، مثل حساب مراقبة يسجّل الدخول ويبحث. تلتقط الأعطال في المسارات الهادئة وفي الليل، لكنها لا تغطي إلا ما كتبه أحدهم.
إشارات المراقبة كسلسلة: ينتج المستخدمون الحقيقيون والفحوص الاصطناعية مقاييس وسجلات ومسارات طلبات، ويستدعي تنبيهٌ على عَرَض يشعر به المستخدم شخصاً ينتقل من المقاييس إلى السجلات ثم إلى المسار قبل أن يتصرف. نموذج مفاهيمي
  1. 1المستخدمون الحقيقيونكل طلب من الاستخدام الحقيقي
    في الوقت نفسه
    • 2الفحوص الاصطناعيةرحلات مكتوبة من خارج النظام كل بضع دقائقالصندوق الأسود
  2. 3المقاييسأرقام عبر الزمن: هل هناك خلل؟الصندوق الأبيض
    يسجّلها النظام
    • 4السجلاتقيد لكل حدث: ماذا حدث؟الصندوق الأبيض
    • 5مسارات الطلباتطلب واحد عبر الخدمات: أين فشل؟الصندوق الأبيض
  3. 6قاعدة التنبيهعَرَض يشعر به المستخدمون: ينخفض المؤشر SLI تحت عتبته

    فرع: أقل إلحاحاً ← تذكرة لا استدعاء

    بوابة: عاجل: يحتاج إلى شخص الآن

  4. 7استدعاء المناوبالمطوّر المناوب، ومعه غالباً دليل تشغيل
  5. 8التشخيصالعَرَض في المقاييس، ثم تُظهر السجلات والمسار أين حدث الخلل ولماذا
  6. 9التصرّفالتراجع، ثم إغلاق التنبيه فقط بعد عودة المؤشر SLI إلى طبيعته

عودة إلى الخطوة 1 يتحول كل عيب متسرّب إلى اختبار أو فحص جديد

صورة مبسّطة: تختلف الأدوات ولوحات المتابعة وأدوار الفريق من فريق إلى آخر.

جرّبها: مدقّق JSON Lines جرّبها: محوّل الطوابع الزمنية جرّبها: شارح تعابير cron

اختبر المراقبة أيضاً

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

  • اجعل خدمة يعتمد عليها النظام تفشل، مثلاً ببديل (Stub) يُرجع الرمز ⁦503⁩، وتأكد أن الخطأ يظهر في المقاييس والسجلات ومسارات الطلبات تحت معرّف طلب واحد، وأن التنبيه يصل إلى شخص.
  • اقرأ عيّنة من أسطر السجلات: بنية صحيحة، وأوقات بتوقيت UTC، وسياق كافٍ للتصرف، ولا بيانات شخصية أو سرية.

جرّبها: محاكي رموز حالة API جرّبها: مدقّق JSON Lines

الاختبار في الإنتاج بأمان

بعض الفحوص لا معنى له إلا في الإنتاج: اختبار الدخان بعد النشر، والفحوص الاصطناعية، وتجربة علم ميزة (Feature Flag) مع الموظفين قبل أن يراه العملاء، ومقارنة الإطلاق الكناري بمجموعته الضابطة. هذه الفحوص تُضاف إلى الاختبار قبل الإصدار ولا تحلّ محله أبداً، ولا تكون آمنة إلا بضوابط متفق عليها مسبقاً.

  • الإذن: لا تختبر إلا الأنظمة التي يملكها فريقك أو لديك إذن مكتوب باختبارها، واتفق على النشاط وموعده والمسؤول عنه، وأبلغ المهندس المناوب.
  • هويات الاختبار: استخدم حسابات مخصصة، معلَّمة بحيث تستبعدها التحليلات والفوترة والتقارير ورسائل العملاء؛ ولا تستخدم أبداً حسابات عملاء حقيقيين أو بياناتهم.
  • لا آثار حقيقية: فضّل الفحوص التي تقرأ فقط، وألغِ ونظّف كل ما تنشئه، ولا تُطلق أبداً مدفوعات أو توصيلات أو رسائل حقيقية إلى العملاء.
  • نطاق ضرر صغير: وجّه أعلام الميزات إلى الموظفين أو حسابات الاختبار، وأبقِ نسب الإطلاق الكناري صغيرة، واحتفظ بمفتاح إيقاف جرّبته من قبل.
  • لا اختبارات حمل على الإنتاج دون اتفاق صريح ومجدول: فالمستخدمون الحقيقيون يتشاركون الخوادم نفسها.

جرّبها: فاحص صحة API

مثال تطبيقي: تنبيه في خدمة الطلبات

لمتجر إلكتروني في الرياض (UTC+3) هدف مستوى خدمة لنقطة النهاية POST /orders: أن تنجح ⁦99.5%⁩ من الطلبات خلال ثانيتين على مدى ⁦30⁩ يوماً، أي ميزانية خطأ تقارب ⁦1,000⁩ إخفاق في الشهر. يُنشر الإصدار ⁦4.2⁩ الساعة ⁦10:20⁩، وفي الساعة ⁦10:31⁩ يستدعي التنبيه أدناه المطوّر المناوب، وينضم إليه المختبِر الذي اختبر الإصدار.

الفحص الاصطناعي لإتمام الشراء ما زال ناجحاً لأنه يدفع بالبطاقة. وعند تقسيم نسبة النجاح حسب طريقة الدفع يتبيّن أن مدفوعات المحفظة وحدها تفشل، وهي نحو ⁦30%⁩ من الطلبات. وتصفية السجلات حسب نقطة النهاية والمستوى تعطي السطر أدناه، ومعرّف مسار الطلب (Trace ID) فيه يفتح مساراً تنتظر فيه خدمة الدفع مزوّد المحفظة ⁦10⁩ ثوانٍ ثم تُنهي المحاولة.

  • السبب: نسخ الإصدار إعداداً من بيئة Staging، فاستدعى الإنتاج خادماً للمحفظة لا يستطيع الوصول إليه. وقد كشف الحقل provider_host ذلك في سطر واحد.
  • الإجراء: استُوفي أحد معايير التراجع في خطة الإصدار، فتراجع الفريق إلى الإصدار ⁦4.1⁩ الساعة ⁦10:52⁩، ولم يُغلق التنبيه إلا بعد عودة المؤشر إلى وضعه الطبيعي. فشل نحو ⁦90⁩ طلباً، أي قرابة عُشر ميزانية الخطأ الشهرية.
  • ثغرات للمراجعة اللاحقة، وهي موضوع الدرس التالي: الفحص الاصطناعي يدفع بالبطاقة فقط، ولم يقارن شيء إعدادات الإنتاج بالقيم المتوقعة، ولم يراقب أي تنبيه نسبة النجاح لكل طريقة دفع.
ALERT 10:31 (UTC+3)  orders-api  page: developer on call
  POST /orders succeeded within 2 s: 72% over the last 10 min (SLO 99.5%)

Log line, pretty-printed (times in UTC):
{ "ts": "2026-10-04T07:29:12.418Z", "level": "error",
  "service": "payment-service", "route": "POST /orders",
  "trace_id": "7d2a91c4e0b54f3a9b18c6e2f4a05d71",
  "method": "wallet", "error": "provider_timeout",
  "elapsed_ms": 10001, "provider_host": "wallet.staging.internal" }

Trace 7d2a91c4...  total 10.05 s, failed
  api-gateway           POST /orders        10.05 s
    orders-service      create order        10.04 s
      payment-service   charge wallet       10.01 s   timeout
        wallet provider (no response)       10.00 s

جرّبها: محوّل الطوابع الزمنية

أخطاء شائعة

  • التوقف عند الإصدار وترك المراقبة للآخرين، فتصل إخفاقات الإنتاج إلى الفريق عن طريق العملاء.
  • التنبيه على كل سبب وكل خطأ منفرد بدلاً من الأعراض التي يشعر بها المستخدمون، حتى يكتم الناس التنبيهات.
  • متابعة المتوسطات وحدها: متوسط زمن استجابة يبلغ ⁦300⁩ مللي ثانية قد يخفي p95 يبلغ ⁦4⁩ ثوانٍ.
  • تسجيل البيانات الشخصية أو كلمات المرور أو الرموز «لأغراض التصحيح»، فتتحول السجلات إلى تسريب بيانات.
  • الوثوق بفحص اصطناعي ناجح دليلاً على أن كل شيء يعمل، مع أنه لا يغطي إلا مساره المكتوب.
  • الاختبار في الإنتاج بحسابات عملاء حقيقيين أو مدفوعات حقيقية أو حمل لم يُعلَن عنه.

من منظور ضمان الجودة

أدخِل المراقبة في جلسات تحسين القصص (Refinement) وتخطيط الإصدار: لكل قصة عالية المخاطر اسأل أي مؤشر مستوى خدمة تؤثر فيه، وأي حقول سجل أو مقاييس تحتاج إليها، وكيف سيعرف الفريق أنها تعمل في الإنتاج. وبعد الإصدار تابع لوحات المتابعة مع المطوّر المناوب طوال المدة المتفق عليها.

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

تمرين عملي

خطّط مراقبة حجز المواعيد

المطلوب

يتيح تطبيق عيادة للمرضى حجز موعد مدته ⁦15⁩ دقيقة، ثم يرسل رسالة SMS للتأكيد. مستعيناً بأسطر السجل الأربعة أدناه من بيئة الاختبار، خطّط كيف ستُقاس جودة هذه الميزة في الإنتاج وكيف تُراقَب وتُفحص بأمان.

المادة
{"ts":"2026-11-02T09:14:03Z","level":"info","req":"r-51c","msg":"booking created"}
{"ts":"2026-11-02 12:14:05","level":"info","msg":"SMS sent to +966500000001"}
{"ts":"2026-11-02T09:15:40Z","level":"error","req":"r-52d","msg":"Error"}
{"ts":"2026-11-02T09:16:02Z","level":"debug","req":"r-53e","token":"eyJhbGciOi..."}
الخطوات
  1. اكتب مؤشر مستوى خدمة واحداً مع هدفه لعملية الحجز، وإشارة أعمال واحدة.
  2. اكتب كل مشكلة تجدها في أسطر السجل الأربعة.
  3. اكتب تنبيهاً واحداً وفحصاً اصطناعياً واحداً مع جدول تشغيله.
  4. اكتب الضوابط اللازمة لتشغيل هذا الفحص في الإنتاج.
إظهار الإجابة النموذجية
الإجابة النموذجية

المؤشر: نسبة طلبات POST /bookings التي تُنشئ حجزاً خلال ثانيتين؛ والهدف مثلاً ⁦99.5%⁩ على مدى ⁦30⁩ يوماً، يُتفق عليه مع مالك المنتج. إشارة الأعمال: نسبة الحجوزات التي تُرسل رسالة تأكيدها خلال ⁦5⁩ دقائق.

السجلات: السطر الثاني يستخدم الوقت المحلي دون منطقة زمنية (فإن كان الخادم يعمل بتوقيت UTC+3 فالوقت ⁦12:14:05⁩ هو ⁦09:14:05⁩ بتوقيت UTC، لكن لا شيء في السطر يقول ذلك)، ويسجّل رقم هاتف كاملاً (بيانات شخصية)، ولا يحمل معرّف طلب؛ والسطر الثالث يقول «Error» فقط دون نقطة نهاية أو سبب أو رمز خطأ؛ والسطر الرابع مخرجات تصحيح (debug) ينبغي إيقافها في الإنتاج، وهو يحتوي رمز وصول، وهذا عيب أمني يُبلَّغ عنه بخطورة عالية. أما السطر الأول فسليم، وإن كانت تصفية الأسطر الأربعة ستكون أسهل لو حملت حقلاً للخدمة وحقلاً لنقطة النهاية.

التنبيه: استدعِ المطوّر المناوب، مع دليل تشغيل، حين تنخفض نسبة نجاح الحجز خلال ⁦10⁩ دقائق عن ⁦98%⁩؛ وافتح تذكرة حين تتأخر رسائل التأكيد عن الحجوزات لمدة ⁦30⁩ دقيقة. الفحص الاصطناعي: كل ⁦5⁩ دقائق (*/5 * * * *) يحجز حساب مراقبة موعداً لدى طبيب اختبار مخفي عن المرضى، ويتحقق من التأكيد، ثم يلغي الحجز.

الضوابط: يوافق مالك نظام العيادة على الفحص؛ ويُستبعد طبيب الاختبار ومريض الاختبار من الجداول والتقارير والإحصاءات؛ ويُلغى كل حجز؛ وتذهب الرسالة إلى رقم يملكه الفريق فقط؛ وحين يفشل الفحص يصل التنبيه إلى شخص حقيقي.

أسئلة شائعة

هل المراقبة مهمة المختبِرين أم فريق العمليات؟

إنها مسؤولية مشتركة. فعادةً يبني المطورون أو فريق العمليات أو مهندسو SRE المراقبة ويتولّون المناوبة. ويسأل المختبِرون عمّا سيُراقَب في كل تغيير، ويراجعون التنبيهات والسجلات والفحوص الاصطناعية، ويختبرون أنها تعمل، ويستفيدون مما يُظهره الإنتاج لتحسين اختباراتهم. وفي الفرق الصغيرة كثيراً ما يُعدّ المختبِر الفحوص الاصطناعية بنفسه.

ما الفرق بين المراقبة وقابلية الملاحظة (Observability)؟

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

هل تعني لوحة متابعة خضراء أن جودة الإنتاج جيدة؟

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

المراجع

  • Monitoring Distributed Systems — Site Reliability Engineering (Rob Ewaschuk)Google / O'Reilly Media · 2016إرشادات SRE من Google في المراقبة: المراقبة من الخارج (black-box) مقابل المراقبة من الداخل (white-box)، والإشارات الذهبية الأربع — زمن الاستجابة والحركة والأخطاء والتشبّع.
  • Site Reliability Engineering: How Google Runs Production SystemsGoogle / O'Reilly Media · 2016أهداف مستوى الخدمة وميزانيات الخطأ ومراقبة «الإشارات الذهبية الأربع» والتعامل مع الحمل الزائد — الجانب التشغيلي للمرونة.
  • OWASP Cheat Sheet Series: LoggingOWASP Foundationما يُسجَّل وما لا يُسجَّل أبداً (كلمات المرور والرموز والبيانات الشخصية)، وكيف تُبقى السجلات قابلة لكشف العبث.
  • ISTQB Certified Tester Foundation Level (CTFL) v4.0ISTQB · 2023المنهج التأسيسي لاختبار البرمجيات: مستويات الاختبار وأنواعه وتقنيات تصميم الاختبارات وإدارة الاختبار والأدوات.

تدرّب بأدوات متقن

افحص عدة نقاط نهاية لصحة API دفعة واحدة واحصل على الحالة وزمن الاستجابة وملخّص نجاح/فشل.

اختبار واجهات API

التحقق من كل سطر في ملف JSON Lines والإبلاغ عن الأسطر الفاشلة بدقة.

JSON والبيانات

حوّل الطوابع الزمنية (ثوانٍ، ميلي ثانية، ميكرو ثانية) إلى تواريخ مقروءة وبالعكس، بأي منطقة زمنية.

أدوات مساعدة

احصل على نقطة نهاية عامة تعيد أي رمز حالة HTTP، مع تأخير اختياري وجسم JSON مخصّص، لاختبار معالجة الأخطاء في العميل.

اختبار واجهات API

ترجم أي تعبير cron إلى لغة إنجليزية مبسّطة واعرض أوقات التشغيل القادمة.

أدوات مساعدة

قِس زمن استجابة نقطة نهاية عبر عدة عيّنات: الحد الأدنى والأقصى والمتوسط والوسيط وp95.

الأداء

للتعمّق أكثر

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة