أذكرها وكأنها البارحة، ليلة خميس هادئة، والفريق يستعد لنهاية أسبوع مستحقة بعد إطلاق تحديث كبير على نظامنا. كنت قد بدأت للتو بمشاهدة فيلمي المفضل، وفجأة، بدأ هاتفي يهتز بلا توقف. رسائل على مجموعة الفريق: “الموقع بطيء جداً!”، “المستخدمون يشتكون من أخطاء 503!”، “يا جماعة الخير، شو القصة؟”.
في تلك اللحظة، تحولت أمسيتي الهادئة إلى غرفة عمليات حربية. كل واحد منا فتح الـ SSH على خادم مختلف، وبدأنا الطقوس المقدسة والمؤلمة في نفس الوقت: top، htop، free -m، df -h، والغوص في سجلات (logs) لا نهاية لها باستخدام tail -f. كل واحد منا يرى جزءاً صغيراً من الصورة، لكن لا أحد يرى الصورة الكاملة. كانت خوادمنا صناديق سوداء تماماً؛ نعرف أنها تعمل، لكن لا ندري حقاً ما الذي يحدث بداخلها لحظة بلحظة.
بعد ثلاث ساعات من التخمين والبحث اليائس، عادت الأمور إلى طبيعتها من تلقاء نفسها، تماماً كما بدأت. لم نعرف أبداً السبب الجذري الحقيقي. هل كان ارتفاعاً مفاجئاً في عدد الزوار؟ استعلام قاعدة بيانات بطيء؟ تسريب في الذاكرة؟ لم تكن لدينا أي بيانات تاريخية لنحللها. كل ما عشناه كان جحيم التحقيق بأثر رجعي. تلك الليلة كانت القشة التي قصمت ظهر البعير، وقلنا بصوت واحد: “هذا الوضع لا يمكن أن يستمر”. ومن هنا بدأت رحلتنا مع المراقبة الحقيقية، رحلتنا مع بروميثيوس وجرافانا.
ما قبل بروميثيوس وجرافانا: العيش في الظلام
قبل أن نتبنى أدوات المراقبة الحديثة، كانت استراتيجيتنا “رد فعل” بحتة. كنا ننتظر حدوث المشكلة ثم نبدأ بالتحقيق. هذا الأسلوب كان له عيوب قاتلة:
- غياب البيانات التاريخية: عندما يتعطل الخادم، نفقد كل السياق. الأوامر مثل
topتعطيك لقطة لحظية، ولكنها لا تخبرك ماذا كان استهلاك المعالج قبل 10 دقائق من الانهيار. - صعوبة ربط الأحداث: هل ارتفاع استخدام المعالج في خادم التطبيق مرتبط بارتفاع الضغط على قاعدة البيانات؟ بدون رؤية موحدة، كان الربط بين هذه الأحداث مجرد تخمين.
- إهدار الوقت والجهد: كان مهندس أو اثنان يقضيان ساعات كل أسبوع في محاولة يائسة لتجميع الأدلة بعد وقوع الكارثة، بدلاً من استثمار هذا الوقت في تطوير الميزات.
- الإنذارات غير الفعالة: كانت معظم إنذاراتنا بدائية، مثل “الخادم لا يستجيب”. كنا نعرف بالمشكلة بعد أن يكون الأوان قد فات والمستخدمون قد تأثروا بالفعل.
باختصار، كنا نعمل بشكل أعمى، ونأمل ألا يحدث شيء سيء.
ظهور الضوء في نهاية النفق: ما هما بروميثيوس وجرافانا؟
في خضم بحثنا عن حل، ظهر اسمان بشكل متكرر: Prometheus و Grafana. هذه الثنائية ليست مجرد أدوات، بل هي نقلة نوعية في فلسفة إدارة البنية التحتية، من المراقبة (Monitoring) إلى ما يسمى بـ “القابلية للملاحظة” (Observability).
بروميثيوس (Prometheus): المُجمِّع الصامت
بروميثيوس هو بمثابة المؤرخ الدقيق لنظامك. إنه قاعدة بيانات من نوع “السلاسل الزمنية” (Time-Series Database) مصممة خصيصاً لتخزين المقاييس (Metrics) مع طابع زمني. فكر فيه كشخص يسجل كل ثانية: “استهلاك المعالج الآن 45%، الذاكرة المستخدمة 3.2GB، عدد الطلبات في الثانية 120… وهكذا”.
أهم ما يميز بروميثيوس هو نموذج “السحب” (Pull model). بدلاً من أن ترسل له تطبيقاتك البيانات، يقوم هو بـ “كشط” (Scrape) البيانات من نقاط نهاية (endpoints) محددة تكشفها تطبيقاتك وخوادمك. هذا يجعله قوياً ومرناً للغاية.
نصيحة أبو عمر: جمال نموذج السحب يكمن في بساطته. يمكنك إضافة أي خدمة للمراقبة بمجرد أن تكشف عن مقاييسها عبر نقطة نهاية HTTP، دون الحاجة لتعديل إعدادات بروميثيوس المعقدة في كل مرة.
جرافانا (Grafana): الفنان الذي يرسم البيانات
إذا كان بروميثيوس هو المؤرخ، فإن جرافانا هو الفنان الذي يأخذ كل تلك الأرقام والبيانات الخام ويحولها إلى لوحات فنية جميلة ومفهومة (Dashboards). جرافانا لا يخزن أي بيانات بنفسه، بل يتصل بمصادر بيانات مختلفة (مثل بروميثيوس) ويستعلم منها ثم يعرض النتائج بطريقة بصرية مذهلة.
مع جرافانا، يمكنك أن ترى رسماً بيانياً يوضح علاقة استهلاك المعالج بعدد المستخدمين النشطين، أو أن تضع مقاييس خادم الويب وقاعدة البيانات جنباً إلى جنب لترى كيف يؤثر أحدهما على الآخر في الوقت الفعلي.
رحلتنا العملية: من الفكرة إلى لوحة التحكم
الكلام النظري جميل، لكن دعونا نتحدث “عملي”. كيف انتقلنا من الصفر إلى نظام مراقبة متكامل؟ سأقسمها لكم إلى خطوات بسيطة.
الخطوة الأولى: تجهيز بروميثيوس (Prometheus)
أولاً، قمنا بتثبيت بروميثيوس على خادم منفصل. أسهل طريقة للبدء هي عبر Docker. بعد ذلك، يأتي الجزء الأهم وهو ملف الإعدادات prometheus.yml. هذا الملف يخبر بروميثيوس أين يجد الخدمات التي يجب أن يراقبها.
للبدء، قررنا مراقبة حالة الخوادم نفسها (CPU, Memory, Disk) باستخدام أداة اسمها Node Exporter. كل ما عليك هو تشغيل هذا الـ exporter على كل خادم تريد مراقبته، ثم إضافة الخوادم إلى ملف إعدادات بروميثيوس.
مثال بسيط على ملف prometheus.yml:
global:
scrape_interval: 15s # كل 15 ثانية يقوم بسحب البيانات
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['server1.example.com:9100', 'server2.example.com:9100']
في هذا المثال، بروميثيوس سيراقب نفسه، بالإضافة إلى خادمين آخرين يعمل عليهما Node Exporter على المنفذ 9100.
الخطوة الثانية: كشف المقاييس من تطبيقاتنا (Instrumenting our Apps)
مراقبة الخوادم رائعة، لكن القوة الحقيقية تأتي من مراقبة التطبيق نفسه. كم عدد المستخدمين المسجلين الآن؟ كم عدد الأخطاء من نوع 404 التي حدثت في الدقيقة الأخيرة؟ كم من الوقت تستغرقه عملية الدفع؟
هذا ما يسمى بـ “Instrumentation”. معظم لغات البرمجة لديها مكتبات رسمية أو مجتمعية لبروميثيوس تجعل هذه العملية سهلة جداً. بما أن جزءاً كبيراً من نظامنا مكتوب بلغة Python، استخدمنا مكتبة prometheus_client.
مثال بسيط في تطبيق Flask (بايثون) لإحصاء عدد الطلبات التي يستقبلها:
from flask import Flask, Response
from prometheus_client import Counter, generate_latest
app = Flask(__name__)
# إنشاء عداد جديد
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP Requests')
@app.route('/')
def hello_world():
# كلما تم استدعاء هذا المسار، زد العداد بمقدار 1
REQUEST_COUNT.inc()
return 'Hello, World!'
@app.route('/metrics')
def metrics():
# نقطة النهاية التي سيقوم بروميثيوس بسحب البيانات منها
return Response(generate_latest(), mimetype='text/plain; version=0.0.4')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
الآن، كل ما علينا فعله هو إضافة 'myapp.example.com:8000' إلى ملف إعدادات بروميثيوس تحت وظيفة (job) جديدة، وسيبدأ فوراً بجمع مقياس http_requests_total.
نصيحة أبو عمر: لا تقتصر على المقاييس التقنية! أضف مقاييس تتعلق بالعمل نفسه (Business Metrics). مراقبة عدد عمليات الشراء المكتملة في الدقيقة أهم بكثير من مراقبة استخدام الـ CPU فقط. هذا يساعدك على فهم تأثير المشاكل التقنية على العمل مباشرة.
الخطوة الثالثة: ربط جرافانا وبناء أول لوحة تحكم
هنا يبدأ السحر. بعد تثبيت جرافانا (أيضاً عبر Docker بكل سهولة)، قمنا بالخطوات التالية:
- إضافة مصدر البيانات: في واجهة جرافانا، ذهبنا إلى قسم “Data Sources” وأضفنا Prometheus. كل ما احتجناه هو إدخال عنوان URL لخادم بروميثيوس (مثلاً
http://prometheus-server:9090). - إنشاء لوحة تحكم جديدة: بدأنا بلوحة تحكم فارغة وأضفنا أول “Panel” لنا.
- كتابة أول استعلام: في الـ Panel الجديد، اخترنا مصدر البيانات Prometheus، وكتبنا أول استعلام لنا بلغة PromQL. لعرض معدل الطلبات على تطبيقنا خلال الخمس دقائق الماضية، كان الاستعلام بسيطاً جداً:
rate(http_requests_total[5m]).
في غضون دقائق، كان لدينا رسم بياني حيّ يتحدث إلينا، يروي قصة تطبيقنا لحظة بلحظة. كانت تلك لحظة “وجدتها!”.
نصيحة أبو عمر من ذهب: لا تعيد اختراع العجلة! مجتمع جرافانا مليء بلوحات التحكم الجاهزة (Community Dashboards) لمعظم التقنيات الشائعة (مثل Node Exporter, MySQL, Nginx). اذهب إلى موقع جرافانا الرسمي، ابحث عن لوحة التحكم التي تحتاجها، وقم باستيرادها باستخدام رقمها التعريفي (ID). يمكنك بعد ذلك تعديلها لتناسب احتياجاتك الخاصة. هذا يوفر عليك ساعات من العمل.
النتائج المذهلة: كيف تغير كل شيء؟
بعد تطبيق هذا النظام، تغيرت طريقة عملنا جذرياً:
- من رد الفعل إلى الاستباقية: قمنا بإعداد تنبيهات (Alerts) ذكية في جرافانا. بدلاً من أن نتلقى تنبيهاً عند توقف الخادم، أصبحنا نتلقى تنبيهاً عندما يصل استهلاك الذاكرة إلى 80% لمدة 10 دقائق، مما يمنحنا وقتاً للتدخل قبل وقوع الكارثة.
- تحليل جذري سريع للأعطال: في إحدى المرات، لاحظنا بطئاً في النظام. بنظرة واحدة على لوحة التحكم، رأينا أن زمن استجابة استعلامات قاعدة البيانات قد ارتفع بشكل حاد في نفس اللحظة التي بدأ فيها البطء. خلال دقائق، عرفنا أن المشكلة في قاعدة البيانات، وليس في كود التطبيق. انتهى زمن التخمين.
- تخطيط أفضل للموارد (Capacity Planning): أصبح بإمكاننا رؤية نمو استهلاك الموارد على مدى أشهر. هذا ساعدنا على اتخاذ قرارات مدروسة حول متى نحتاج إلى ترقية خوادمنا، بدلاً من الانتظار حتى “تنفجر”.
- تمكين المطورين: أصبح كل مطور في الفريق قادراً على رؤية تأثير الكود الذي يكتبه على أداء النظام بشكل مباشر. هذا خلق ثقافة من المسؤولية والاهتمام بالأداء.
خلاصة أبو عمر ونصيحة من القلب 💡
الانتقال من “الصناديق السوداء” إلى نظام مراقبة وقابلية للملاحظة مع بروميثيوس وجرافانا لم يكن مجرد ترقية تقنية، بل كان تغييراً في العقلية والثقافة. لقد حولنا الفوضى إلى وضوح، والتوتر إلى ثقة. لم نعد نخاف من ليالي الخميس، بل أصبحنا ننظر إلى لوحات التحكم الخاصة بنا بفخر، عالمين أننا نسيطر على زمام الأمور.
إذا كنت لا تزال تعيش في عالم التحقيق بأثر رجعي، فنصيحتي لك بسيطة: ابدأ الآن، وابدأ صغيراً. لا تحاول مراقبة كل شيء دفعة واحدة. ابدأ بخادم واحد، أو تطبيق واحد. قم بتثبيت Node Exporter، ابنِ لوحة تحكم بسيطة في جرافانا، وشاهد بنفسك كيف يمكن للبيانات أن تروي لك قصة لم تكن تعرفها عن نظامك. أعدك، لن تنظر إلى الوراء أبداً. بالتوفيق يا جماعة الخير!