إدارة التنبيهات مع Alertmanager
إدارة التنبيهات مع Alertmanager
يقوم Prometheus بإطلاق التنبيهات — يقيّم قواعد التنبيه ويصنّفها إما كـpending (معلقة) أو firing (نشطة). غير أن Prometheus نفسه لا يرسل رسائل بريد إلكتروني، ولا يستدعي المهندسين المناوبين، ولا ينشر في Slack. تلك المهمة تقع على عاتق Alertmanager: وهو خادم مستقل يستقبل إشعارات التنبيه من خادم أو عدة خوادم Prometheus، ويطبّق منطق التوجيه، ويزيل التكرار، ويجمّع التنبيهات ويكتمها ويوجّهها إلى الأشخاص المناسبين عبر القنوات المناسبة في الوقت المناسب. إتقان Alertmanager هو ما يفرق بين نظام يرسل خمسين إشعارًا خلال عطل واحد، ونظام يرسل تذكرة واحدة واضحة إلى الفريق الصحيح في الساعة الثانية فجرًا.
المفاهيم الأساسية قبل الإعداد
يعمل Alertmanager على إشعارات التنبيه التي يرسلها Prometheus عبر HTTP. يحمل كل إشعار مجموعة من التسميات (نفس تسميات قاعدة التنبيه)، وتعليقات توضيحية، ورابط المُولِّد، وبيانات التوقيت. مهمة Alertmanager هي الإجابة على أربعة أسئلة لكل دفعة من التنبيهات الواردة:
- إلى أين تذهب؟ — تُعيّن شجرة التوجيه مجموعات التسميات إلى جهات الاستقبال.
- متى تُرسل؟ — التجميع وgroup_wait / group_interval / repeat_interval تتحكم في التوقيت لتفادي عواصف الإشعارات.
- هل تُكتم؟ — الصوامت وقواعد الكبت تمنع الضوضاء الزائدة أو المتوقعة.
- من يستقبلها؟ — تحدد جهات الاستقبال التكاملات الفعلية (PagerDuty, Slack, البريد الإلكتروني، OpsGenie، Webhook).
شجرة التوجيه
إعداد التوجيه في Alertmanager عبارة عن شجرة من عقد المسارات. تحمل كل عقدة شروط التطابق (مطابقات تسميات محددة أو تعبيرات نمطية)، واسم جهة الاستقبال، وتجاوزات التوقيت الاختيارية. تسير مجموعات التنبيهات الواردة عبر الشجرة بعمق أولاً، وتفوز أول عقدة مطابقة ما لم يكن continue: true مضبوطًا للسماح بالمواصلة.
المفتاح group_by بالغ الأهمية وكثيرًا ما يُساء فهمه. يخبر Alertmanager بأبعاد التسميات التي تُعرّف "المجموعة" لأغراض التجميع. إذا جمّعت حسب [alertname, cluster, env]، ستُطلق جميع التنبيهات التي تشترك في هذه القيم الثلاث كإشعار واحد، حتى لو اختلفت في pod أو instance. هذا يمنع عشر عمليات إعادة تشغيل للـ pods المتزامنة من توليد عشر إشعارات مستقلة.
group_wait هو وقت تخزين مؤقت عند نشأة مجموعة جديدة، يمنح Prometheus فرصة لإطلاق تنبيهات ذات صلة قبل أن يرسل Alertmanager الإشعار الأول. أما group_interval فيحكم عمليات الإرسال اللاحقة لنفس المجموعة عند انضمام تنبيهات جديدة إليها. ضبط group_wait بشكل أقصر من اللازم يسبب عواصف إشعارات أثناء الأعطال المتتالية؛ وضبطه أطول من اللازم يُؤخر أول استدعاء. ثلاثون ثانية افتراضية معقولة لمعظم بيئات الإنتاج.قواعد الكبت (Inhibition Rules)
الكبت هو ميزة Alertmanager الأقل استخدامًا والتي يتمنى معظم المهندسين لو أعدّوها مبكرًا. تقول قاعدة الكبت: "إذا كان التنبيه A نشطًا بهذه التسميات، اكبت أي تنبيه B يطابق هذه التسميات الأخرى." هذا لا غنى عنه لمنع ضوضاء الأعراض حين يكون تنبيه السبب الجذري نشطًا بالفعل.
المثال النموذجي: يُطلق تنبيه NodeDown. بعد ثوان، تُطلق عشرون تنبيهات PodCrashLooping وHighLatency من نفس العقدة. بدون الكبت، يتلقى مهندس المناوبة إحدى وعشرين إشعارًا. مع قاعدة كبت تقول "اكبت كل شيء على نفس تسمية node حين يكون NodeDown نشطًا"، يتلقى واحدًا فقط. يجب أن يشترك مصدر الكبت والهدف في نفس قيم التسميات المحددة في equal لتُطبَّق عملية الكبت.
equal واسعة للغاية.الصوامت (Silences)
الصوامت هي كتم مؤقت قائم على التسميات يُطبَّق عبر واجهة Alertmanager أو API. هي الأداة الصحيحة لنوافذ الصيانة المجدولة والفترات المعروفة بالمشكلات: تكتم مجموعة من التسميات لمدة محددة، وتُكبت جميع التنبيهات المطابقة دون أي تغيير في إعداد التوجيه أو الكبت. تحمل الصوامت اسم المنشئ وتعليقًا وتاريخ انتهاء — وهي قابلة للتدقيق.
أداة سطر الأوامر amtool هي الطريقة الاحترافية لإدارة الصوامت برمجيًا، لا سيما داخل سكريبتات أتمتة الصيانة:
مسار التنبيه من البداية للنهاية
فهم المسار الكامل الذي يقطعه التنبيه يساعدك في تشخيص الإشعارات الفائتة والإشعارات المكررة — وهما أكثر شكاوى Alertmanager شيوعًا في البيئات الكبيرة.
تكاملات المناوبة في الإنتاج
على نطاق المؤسسات الكبيرة، تحمل تكاملات PagerDuty وOpsGenie أكبر عبء تشغيلي. بعض الأنماط التي تستحق الانتباه:
- ربط مستوى الخطورة: عيّن تسميات
severityفي Prometheus مباشرة إلى مستويات خطورة PagerDuty (critical→ P1 فوري،warning→ P3 خلال ساعات العمل). يتم هذا في حقل القالبpagerduty_configs.severity. - مفاتيح إزالة التكرار: يرسل Alertmanager
dedup_keyثابتًا (مستمدًا من بصمة التنبيه) بحيث تُحدَّث الإشعارات المتكررة لنفس التنبيه النشط حادثة PagerDuty القائمة بدلاً من فتح حادثة جديدة. هذا تلقائي — لكنه يعمل بشكل صحيح فقط إذا كانت تسمياتgroup_byمستقرة عبر إطلاقات التنبيه. - روابط دفاتر التشغيل في التعليقات التوضيحية: أضف دومًا تعليقًا توضيحيًا
runbook_urlإلى قواعد التنبيه، وأظهره في قالب الإشعار حتى يصل مهندس المناوبة إلى دفتر التشغيل الصحيح بنقرة واحدة. - جهات استقبال Webhook: للحصول على منطق توجيه مخصص يتجاوز ما تدعمه شجرة Alertmanager، يمنحك جهاز استقبال webhook يرسل إلى Lambda صغيرة أو Cloud Run قدرة توجيه لا محدودة — مفيد للمنتجات متعددة المستأجرين التي يحتاج تنبيهها إلى التوجيه إلى قناة المستأجر المحددة الصحيحة.
التوفر العالي لـ Alertmanager
إن Alertmanager المنفرد هو نقطة إخفاق واحدة لسلسلة التنبيه بأكملها. يدعم Alertmanager تجمّعًا عاليًا للتوفر مبنيًا على بروتوكول gossip: شغّل ثلاث نسخ، وأشر بجميع خوادم Prometheus إليها جميعًا عبر alertmanager_config، ويستخدم Alertmanager بروتوكول Memberlist لتنسيق إزالة تكرار الإشعارات بحيث ترسل نسخة واحدة فقط كل تنبيه. العلامة الجوهرية هي --cluster.peer:
التحقق وتشخيص الأخطاء
أداتان يجب أن تكونا في متناول يدك دومًا كمشغّل Alertmanager: amtool check-config (تتحقق من صحة YAML ومنطق التوجيه قبل إعادة التحميل) ونقطة النهاية /api/v2/alerts (تعرض التنبيهات النشطة حاليًا، مفيدة في دفاتر التشغيل). تتيح واجهة Alertmanager على المنفذ :9093 مصحح شجرة التوجيه المرئي تحت "Status → Routing Tree" — الصق أي مجموعة تسميات وسيعرض لك بالضبط أي جهة استقبال ستستقبلها. هذا لا يقدر بثمن عند تشخيص سبب توجيه تنبيه إلى القناة الخاطئة.