مستوى المقال: متوسط. محتاج تكون شغّلت تطبيق ويب ورا Nginx أو داخل Kubernetes، وسمعت عن Prometheus من قبل حتى لو ماستخدمتهوش بعمق. مش محتاج تكون خبير مراقبة.
ليه المتوسط بيكذب عليك في زمن الاستجابة
لو الداشبورد بتقولك إن متوسط زمن الاستجابة 91 مللي ثانية، ده مش معناه إن مستخدمينك مبسوطين. المتوسط بيخبّي أبطأ 5% من الطلبات، وهم بالظبط الناس اللي بتزعل وتسيب المنتج. في المقال ده هتعرف تقيس p95 وp99 صح بـ Prometheus، وتحط رقم حقيقي على معاناة أبطأ مستخدميك.
المشكلة باختصار
عندك API بيخدم 50 ألف طلب في الساعة. الجراف بيقول Average latency = 91ms، وانت مطمّن. بس فيه تذاكر دعم بتقول "الموقع بطيء". السبب إن توزيع زمن الاستجابة مش متماثل: أغلب الطلبات سريعة، وذيل طويل من الطلبات البطيئة بيوصل لثواني. المتوسط بيغرق وسط الطلبات السريعة، والذيل بيختفي.
مثال يقرّب الفكرة
تخيّل 10 زباين في محل قهوة. 9 منهم اتخدموا في 30 ثانية، وواحد استنى 5 دقايق عشان الماكينة علّقت. لو حسبت المتوسط: (9×30 + 300) ÷ 10 = 57 ثانية للزبون. الرقم ده بيقول "خدمة كويسة"، بس فيه زبون قعد 5 دقايق واتجنّن. المتوسط مسحه من الوجود.
الحل إنك متبصّش للمتوسط، تبصّ للترتيب. رتّب أزمنة الانتظار من الأصغر للأكبر، وبُص على "أسوأ حالة عند 90% أو 95% من الزباين". ده اللي بيحكي القصة الحقيقية.
ليه المتوسط بيكذب علميًا
زمن الاستجابة في الأنظمة الموزّعة توزيعه ملتوٍ لليمين (right-skewed): كتلة كبيرة عند القيم الصغيرة، وذيل طويل. المتوسط (mean) حسّاس جدًا للقيم المتطرفة في الذيل من ناحية، لكنه في نفس الوقت بتغرقه الكتلة الكبيرة من القيم الصغيرة. النتيجة: رقم واحد لا يمثّل لا الأغلبية ولا المتضررين.
البديل هو المئينات (Percentiles). الـ p95 هو القيمة اللي 95% من الطلبات أقل منها. يعني p95 = 213ms معناه: 95 طلب من كل 100 خلصوا في أقل من 213 مللي ثانية، و5 طلبات أخدوا أكتر. الـ p99 بيركّز على أسوأ 1% — وغالبًا هو اللي بيكسر تجربة المستخدم في أوقات الذروة.
إزاي Prometheus بيحسب الـ p95
Prometheus مبيخزّنش كل طلب على حدة، ده هيفجّر التخزين. بدل كده بيستخدم نوع مقياس اسمه Histogram. الفكرة إنك بتحدّد "دلاء" (buckets) مسبقًا بحدود عليا، وكل طلب بيزوّد عدّاد كل دلو حدّه العلوي أكبر من زمن الطلب. فبتطلع عندك أعداد تراكمية.
لحساب p95، دالة histogram_quantile بتلاقي الدلو اللي بيعدّي عنده خط الـ 95%، وتعمل استيفاء خطي جواه. في الرسمة فوق، الـ 95% واقعة بين دلو le=1 (عند 89%) ودلو le=2.5 (عند 97%)، فالنتيجة التقريبية حوالي 2.1 ثانية. ركّز: الرقم ده تقريبي بدقة الدلاء، مش قيمة مضبوطة.
مثال تنفيذي: كود + PromQL
أول حاجة، عرّف الـ Histogram بدلاء منطقية لتطبيقك. لو الأهداف بتاعتك بالمللي ثانية، خلّي الدلاء حواليها. مثال بمكتبة Prometheus الرسمية في بايثون: