SLO و Error Budget بالعربي: إزاي تاخد قرار الـ Deploy بالأرقام
لو الفريق بتاعك بيتخانق كل أسبوع حول "نعمل deploy دلوقتي ولا نستنى؟" المشكلة مش في المهندسين — المشكلة إنكم ما عندكوش رقم متفقين عليه. SLO و Error Budget هما الرقم ده بالظبط، وبيحوّلوا القرار من إحساس لعملية حسابية واضحة الكل شايفها.
المشكلة باختصار
99.9% uptime بتبان كويسة على الورق. في الواقع دي معناها 43 دقيقة ونص downtime مسموح بيها شهرياً. لو النظام عدّى الحد ده في يوم 15 من الشهر، باقي الـ 15 يوم لازم يبقوا شبه 100% stable — أي deploy فيه risk بقى خطر.
الفرق بين فريق بيتحكم في الـ risk ده وفريق بيتفاجأ بيه: الأول بيقيس، والتاني بيتمنى. هذا الشرح مبني على فرضية إن عندك application production بيخدم ≥ 1000 مستخدم يومياً، وعندك Prometheus أو أي metrics store شبيه.
مثال بسيط قبل المصطلحات
تخيّل إنك بتدير مطعم بيوصل طلبات. وعدت عملاءك إن الطلب هيوصل في 45 دقيقة أو أقل. اتفقت مع نفسك إن 5% من الطلبات ممكن تتأخر في حالات استثنائية (زحمة، مطر، عطل موتوسيكل).
الـ 5% دي ميزانيتك للفشل. لو خلصت في أول أسبوع من الشهر، معناها ممنوع تاخد طلبات بعيدة (فيها risk تأخير) لحد آخر الشهر، ولازم تركّز على الطلبات القريبة بس. بكده بتحمي وعدك للعملاء.
ده بالظبط المبدأ العلمي اللي بنشتغل بيه في الـ SLO. الفرق إننا بنقيسه بأرقام من نظام الـ metrics، مش بالحس.
SLI و SLO و Error Budget بدقة
هنطبّق المفاهيم الثلاثة على شركة توصيل طعام. الـ API بتاع "إنشاء طلب" هو القلب:
- SLI (Service Level Indicator): الرقم اللي بنقيسه فعلاً. مثال: نسبة الطلبات اللي بترجع HTTP 2xx في أقل من 500ms.
- SLO (Service Level Objective): الهدف المعلن داخلياً. مثال: 99.5% من الطلبات لازم تحقق الـ SLI ده خلال 30 يوم rolling window.
- Error Budget: الفرق بين 100% والـ SLO. في المثال ده: 0.5% = 3.6 ساعة فشل مسموح بيها شهرياً.
القاعدة اللي بتحكم الفريق: طول ما الـ Error Budget فيه رصيد، ممكن تعمل deploy وتجرّب features. لما الرصيد يخلص، الأولوية بتتحول لتثبيت النظام.
الفرق بين SLO و SLA
ناس كتير بتخلط. الـ SLA التزام خارجي للعملاء، غالباً مع تعويض مادي لو اتخرق. الـ SLO هدف داخلي أقل منه بشوية (يعني لو SLA = 99.9%، SLO = 99.95% علشان فيه safety margin). SLI هو الرقم اللي بيقيس الاتنين.
إزاي تقيس SLI بـ Prometheus
لو عندك Prometheus بيجمع metrics من الـ API، الـ query ده بيحسب نسبة النجاح (availability SLI) على 30 يوم:
# نسبة الطلبات الناجحة (status 2xx) خلال آخر 30 يوم
sum(rate(http_requests_total{status=~"2.."}[30d]))
/
sum(rate(http_requests_total[30d]))