يا جماعة، السلام عليكم ورحمة الله.
اسمحوا لي أبدأ معكم بقصة صارت معي قبل كم سنة، قصة ما بنساها. كانت الساعة حوالي 3 الفجر، وأنا في سابع نومة. فجأة، التلفون صار يضوي ويزمّر كأنه يوم القيامة. نظرة سريعة على الشاشة: 50 إشعار جديد من Prometheus، وSentry، وGrafana… كلها بتصرخ “الدنيا خربانة!”.
قلبي صار يدق بسرعة، قمت من التخت وأنا بدعي ربنا تكون الشغلة بسيطة. فتحت اللابتوب، عيوني نصف مغمضة، وبدأت رحلة العذاب: تسجيل دخول على سيرفر الإنتاج عبر SSH، وبعدها فتحت Grafana في تاب جديد عشان أشوف استهلاك الموارد، وبعدها رحت على Kibana عشان أفلتر اللوغز (Logs) وأشوف شو سبب المشكلة. كل هذا وأنا بنتقل بين خمس شاشات مختلفة، وإشعارات Slack شغّالة ما بتهدا، والفريق صاحي وكل واحد بحكي شكل.
بعد ساعة من التنبيش والضغط النفسي، اكتشفت إنه المشكلة كانت مجرد خدمة صغيرة وقفت عن العمل ومحتاجة إعادة تشغيل بسيطة. شغلة بتاخذ 30 ثانية، كلفتنا ساعة من الفوضى والتوتر. وقتها قعدت مع حالي وسألت: “معقول في 2024 لسا بنشتغل بهاي الطريقة البدائية؟ لازم يكون في حل أفضل!”.
ومن هنا، بدأت رحلتنا مع ما يُعرف بالـ ChatOps، المفهوم اللي نقل فريقنا من جحيم الفوضى إلى نعيم الأتمتة والهدوء. في هاي المقالة، رح أحكيلكم الحكاية بالتفصيل.
ما هو الـ ChatOps؟ وليش هو أكتر من مجرد “بوت”؟
بكل بساطة، الـ ChatOps هو ممارسة دمج الأدوات والعمليات والمهام التشغيلية داخل منصة محادثة (زي Slack أو Microsoft Teams). الفكرة مش بس إنك تعمل “بوت” يرد على الناس، لأ. الفكرة أعمق من هيك بكتير.
الـ ChatOps هو تغيير في ثقافة العمل. بدل ما تكون المحادثات مجرد كلام، بتصير هي نفسها “واجهة الأوامر” (Command Line) لكل عملياتك. بدك تعمل deploy لنسخة جديدة؟ بتكتب أمر في الشات. بدك تعيد تشغيل سيرفر؟ بتكتب أمر في الشات. بدك تشوف حالة النظام؟ بتكتب أمر في الشات. كل الفريق بشوف الأمر، وبشوف النتيجة، وكل شيء موثق ومسجل في مكان واحد.
زي ما بنحكيها بالعامية: “بدل ما كل واحد يغني على ليلاه، بنصير كلنا نعزف نفس اللحن في نفس الأوركسترا”.
الفوضى قبل النظام: كيف كان حالنا؟
قبل الـ ChatOps، كانت حياتنا عبارة عن مجموعة من المشاكل المتكررة اللي بتستنزف طاقتنا ووقتنا.
بحر من الإشعارات التي لا معنى لها
كانت قناة #alerts عنا في Slack مكان مرعب. كل ثانية يوصل إشعار جديد من نظام مراقبة مختلف. مع الوقت، صرنا نعاني من إشي اسمه “Alert Fatigue” أو “إرهاق الإشعارات”. الدماغ ببطل يميز بين الإشعار المهم والإشعار التافه، والنتيجة؟ بنتجاهل كل الإشعارات، بما فيها المصايب الكبيرة.
جحيم التنقل بين الشاشات (Context Switching)
زي ما حكيت في قصتي، عشان تحل مشكلة وحدة كنت تحتاج تفتح 5 نوافذ على الأقل:
- نافذة الـ Terminal عشان الـ SSH.
- نافذة المتصفح لـ Grafana (الرسوم البيانية).
- نافذة تانية لـ Kibana أو Graylog (السجلات).
- نافذة لـ Sentry (الأخطاء البرمجية).
- وبالطبع، نافذة Slack عشان تتابع النقاش مع الفريق.
هذا التنقل المستمر بقتل التركيز وبزيد من احتمالية الخطأ البشري. شغلة علمياً بتستنزف الطاقة الذهنية بشكل كبير.
المعرفة المحبوسة (Siloed Knowledge)
لما مهندس شاطر يحل مشكلة، طريقة الحل بتضل في راسه أو في محادثة خاصة. لو غاب هاد المهندس أو ترك الشركة، بتضيع معه خبرته. قناة الشات كانت مليانة كلام، بس مش معلومات منظمة يمكن الرجوع إلها. ما كان في سجل واضح يوضح: شو كانت المشكلة؟ شو الأوامر اللي تنفذت لحلها؟ وشو كانت النتيجة؟
رحلة الإنقاذ: كيف بنينا نظام الـ ChatOps الخاص بنا؟
القرار اتاخد: لازم نغير. وبدأنا رحلتنا خطوة بخطوة. هاي هي الخريطة اللي مشينا عليها:
الخطوة الأولى: اختيار ساحة المعركة (المنصة)
أول قرار كان اختيار منصة الشات اللي رح تكون مركز عملياتنا. الخيارات المشهورة هي Slack، Microsoft Teams، و Mattermost. إحنا اخترنا Slack لأنه كان الأقوى من ناحية الـ API ودعم المطورين والمجتمع الكبير حواليه، بالإضافة لميزة الـ Block Kit اللي بتسمحلك تبني واجهات تفاعلية جميلة داخل الشات.
الخطوة الثانية: بناء “الجندي” الأول (البوت)
ما بتقدر تخوض حرب بدون جنود. جندينا الأول كان بوت بسيط كتبناه بلغة Python باستخدام مكتبة slack_bolt. الهدف الأول كان مجرد التأكد إنه قادرين نتواصل مع Slack API.
نصيحة أبو عمر: ابدأ بأبسط شيء ممكن. لا تحاول تبني “الوحش” من أول يوم. ابدأ ببوت بقول “أهلاً وسهلاً”.
هاد مثال بسيط جداً لبوت بايثون برد على كلمة “مرحباً”:
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
# SLACK_BOT_TOKEN بيبدأ بـ xoxb-
# SLACK_APP_TOKEN بيبدأ بـ xapp-
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))
@app.message("مرحباً")
def message_hello(message, say):
say(f"أهلاً فيك يا {message['user']}! أنا بوت أبو عمر، كيف بقدر أخدمك؟")
if __name__ == "__main__":
handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
handler.start()
بمجرد ما شغلنا هاد الكود وكتبنا “مرحباً” في القناة، ورد علينا البوت… كانت لحظة تاريخية! حسينا إنه فتحنا باب لعالم جديد.
الخطوة الثالثة: تسليح البوت بالأوامر الأساسية
بعد ما صار عنا بوت، بدأنا نعطيه أسلحة (أوامر) مفيدة. أول أمر كان بسيط ومباشر: فحص حالة خدمة معينة على سيرفر.
الأمر في Slack: /bot status api-gateway
الكود اللي بعالج الأمر (بشكل مبسط) كان كالتالي:
import subprocess
@app.command("/bot")
def handle_bot_command(ack, say, command):
ack() # تأكيد استلام الأمر خلال 3 ثواني
text = command.get("text", "")
parts = text.split()
if len(parts) > 1 and parts[0] == "status":
service_name = parts[1]
try:
# هذا الأمر يتم تنفيذه على السيرفر الذي يعمل عليه البوت
# في الواقع، نستخدم أدوات مثل Ansible أو SSH للوصول للسيرفرات البعيدة
result = subprocess.check_output(f"systemctl is-active {service_name}", shell=True)
status = result.decode('utf-8').strip()
say(f"✅ حالة الخدمة `{service_name}` هي: `{status}`")
except subprocess.CalledProcessError:
say(f"❌ لم أتمكن من فحص حالة الخدمة `{service_name}`. قد تكون غير موجودة.")
فجأة، بدل ما أفتح الـ Terminal وأكتب SSH وأدخل كلمة السر… صرت أكتب أمر واحد بسيط من تلفوني وأنا بشرب فنجان القهوة.
الخطوة الرابعة: ربط أنظمة المراقبة بذكاء
هاي كانت النقلة النوعية. بدل ما نخلي Prometheus يرمي الإشعارات بشكل عشوائي، استخدمنا Webhooks عشان نرسل الإشعارات للبوت تبعنا. والبوت بدوره، ما كان يكتفي بعرض الإشعار، بل كان يحلله ويضيف عليه أزرار تفاعلية (Actionable Buttons) باستخدام Slack Block Kit.
مثلاً، لما يوصل إشعار “High CPU Usage on web-server-1”:
الإشعار القديم: [FIRING:1] HighCPUUsage (instance=web-server-1)
الإشعار الجديد مع ChatOps:
🔥 تنبيه: استهلاك عالي للمعالج! 🔥
السيرفر:
web-server-1
الاستهلاك الحالي: 95%ماذا تريد أن تفعل؟
[زر: عرض آخر السجلات 📜] [زر: إعادة تشغيل الخدمة 🔄] [زر: تجاهل التنبيه مؤقتاً 🤫]
بضغطة زر، صار أي مهندس في الفريق يقدر يتخذ إجراء فوري ومباشر. وكل الفريق بشوف مين ضغط الزر وشو كانت النتيجة. شفافية كاملة!
النتائج على أرض الواقع: ما الذي تغير؟
بعد عدة أشهر من التطوير والتحسين، تغيرت طريقة عملنا جذرياً.
- من الضجيج إلى الحوار: الإشعارات صارت بداية حوار تقني موثق، وليس مجرد ضجيج نتجاهله.
- سرعة استجابة “بتخوّف”: متوسط وقت حل المشاكل (MTTR) انخفض بنسبة 70% تقريباً. المشاكل اللي كانت تاخد ساعة، صارت تنحل بدقائق.
- المعرفة للجميع: قناة الشات صارت عبارة عن “سجل عمليات” حي. أي موظف جديد بيقدر يرجع ويقرأ تاريخ الحوادث وكيف تم حلها ويتعلم منها.
- أمان أعلى: بدل ما نعطي كل المطورين صلاحيات SSH على سيرفرات الإنتاج، صرنا نعطي الصلاحيات للبوت فقط. البوت عنده صلاحيات محدودة لتنفيذ أوامر معينة فقط، وكل أمر يتم تسجيله. هذا قلل من المخاطر الأمنية بشكل كبير.
نصائح من قلب المعركة
إذا كنت بتفكر تطبق الـ ChatOps في فريقك، اسمحلي أقدملك كم نصيحة من خبرتي المتواضعة:
- “ابدأ صغيرًا يا خالي”: لا تحاول تبني كل شيء مرة واحدة. ابدأ بأمر واحد بسيط له قيمة عالية، زي فحص حالة خدمة أو إعادة تشغيلها. لما الفريق يشوف الفائدة، رح يتحمسوا للمزيد.
- الأمان أولاً وقبل كل شيء: البوت تبعك رح يكون عنده صلاحيات حساسة. تأكد من أنك بتعقم كل المدخلات (Sanitize inputs)، ولا تعطي البوت صلاحيات أعلى من اللي بحتاجها (Principle of least privilege)، واعمل سجل تدقيق (Audit Log) لكل الأوامر اللي بتتنفذ من خلاله.
- التوثيق هو صديقك: خلي البوت تبعك عنده أمر
/bot helpيعرض كل الأوامر المتاحة وشرح بسيط لكل واحد منها. هذا بساعد الفريق على اكتشاف إمكانيات البوت واستخدامه. - لا تستبدل البشر، بل مكّنهم: الهدف من الـ ChatOps مش الاستغناء عن المهندسين، بل تحريرهم من المهام المتكررة والمملة عشان يركزوا على الإبداع وحل المشاكل الصعبة.
الخلاصة 💡
رحلتنا مع الـ ChatOps كانت أشبه بنقل مقر قيادة عملياتنا من غرف متفرقة ومظلمة إلى غرفة عمليات مركزية، مضيئة، وشفافة. حولنا منصة الدردشة من مجرد أداة للتواصل الاجتماعي إلى أقوى أداة في ترسانتنا التقنية.
الـ ChatOps ليس مجرد تقنية، بل هو عقلية وثقافة. عقلية تؤمن بالشفافية، والتعاون، والأتمتة. إذا كنت أنت وفريقك غارقين في بحر الإشعارات والفوضى التشغيلية، فربما حان الوقت لتبدأوا ببناء قارب النجاة الخاص بكم. ابدأوا اليوم، ولو بأبسط بوت وأبسط أمر. صدقوني، لن تندموا.
بالتوفيق يا جماعة!