لوحات قيادة Grafana
لوحات قيادة Grafana
Prometheus هو محرك بيانات — يجمع ويخزن ويقيّم مقاييس السلاسل الزمنية بكفاءة لا هوادة فيها. لكن محطة أوامر مليئة بنتائج PromQL ليست الطريقة التي يكشف بها البشر تدهور مستويات خدمة SLO أو يتواصلون بصحة النظام عبر جسر المواجهة. Grafana هي طبقة التصور والذكاء التشغيلي التي تحول بيانات Prometheus الخام إلى لوحات القيادة التي تستخدمها فرق الهندسة فعلاً تحت الضغط. يتناول هذا الدرس كيفية هندسة Grafana، وبناء الألواح والمتغيرات التي تتوسع عبر مئات الخدمات، وما هو أهم — كيفية إدارة لوحات القيادة ككود حتى تعيش ما بعد المهندس الذي أنشأها.
كيف يتصل Grafana بـ Prometheus
يعامل Grafana مصادر البيانات ككائنات قابلة للتوصيل من الدرجة الأولى. مصدر بيانات Prometheus يُضبط مرة واحدة — يشير إلى Prometheus أو واجهة استعلام Thanos/Cortex — ثم يُشار إليه بكل لوح عبر جميع لوحات القيادة. كل لوح يطلق استعلام PromQL على ذلك المصدر ويعرض النتيجة كرسم بياني للسلاسل الزمنية، أو إحصاء، أو مؤشر، أو جدول، أو خريطة حرارية، أو مخطط أعمدة.
الشيء الحاسم أن Grafana هو طبقة استعلام خالصة: يرسل PromQL إلى Prometheus عند الطلب (أو على فترة التحديث التي تضبطها) ويعرض ما يعود. لا يخزن أي بيانات مقاييس بنفسه. هذا مهم للهندسة المعمارية: يمكن إعادة تشغيل Grafana بأمان، وتوسيعه أفقياً، أو استبداله دون المساس بتخزين المقاييس. يمكن لنسخ Grafana متعددة أن تشير إلى نفس Prometheus وتعرض لوحات قيادة مطابقة.
تشريح لوحة القيادة
لوحة قيادة Grafana هي مستند JSON يحتوي على قائمة مرتبة من الألواح، ومجموعة متغيرات، وإعدادات النطاق الزمني، والبيانات الوصفية. كل لوح يملك:
- أهداف الاستعلام — واحد أو أكثر من تعبيرات PromQL، كل منها ينتج مجموعة من السلاسل الزمنية.
- نوع التصور — سلسلة زمنية، إحصاء (رقم كبير واحد)، مؤشر، مخطط أعمدة، جدول، خريطة حرارية، سجلات (مع Loki)، رسم بياني لهب (مع Pyroscope).
- التحويلات — معالجة بيانات من جانب الخادم: دمج، ربط، تجميع، حسابات حقول. تُطبّق بعد الاستعلام وقبل العرض.
- التجاوزات وإعداد الحقول — الوحدة (بايت، ثوان، بالمئة)، الخانات العشرية، حدود الألوان، مقياس المحور (خطي مقابل لوغاريتمي).
معظم المهندسين يركزون كلياً على الاستعلامات ويتجاهلون إعداد الحقول. هذا خطأ. لوح يعرض 0.0023 حين يجب أن يعرض 2.3 ms، أو رسم بياني بدون تسميات وحدات، هو لوح قيادة يسبب قراءات خاطئة أثناء الحوادث. اضبط دائماً حقل الوحدة — قائمة وحدات Grafana تغطي البايت والبت/ثانية والبالمئة (0-100 و0.0-1.0 وحدتان مختلفتان) والنانوثانية حتى الساعات والـ RPM وعشرات أخرى.
المتغيرات: محرك لوحات القيادة القابلة لإعادة الاستخدام
لوحة قيادة بأسماء خدمات أو علامات نماذج مُرمَّزة بشكل صارم هي لوحة تتطلب نسخاً لكل خدمة جديدة. متغيرات القوالب هي الآلية التي تجعل لوحة قيادة واحدة تغطي أسطولك بالكامل.
تُعلَن المتغيرات في إعدادات لوحة القيادة تحت Variables. الأنواع الأكثر فائدة هي:
- متغير الاستعلام — يُملأ باستعلام Prometheus عند التحميل. مثال:
label_values(http_requests_total, job)يُعيد كل قيمة مميزة للعلامةjob، مانحاً قائمة منسدلة بجميع الخدمات التي أرسلت يوماً تلك المقاييس. - متغير مخصص — قائمة ثابتة مفصولة بفواصل. استخدمه للبيئة (
prod,staging,dev) أو الخطورة. - متغير الفترة — يتيح للمستخدم اختيار فترة خطوة (
1m,5m,15m,1h) والرجوع إليها في الاستعلامات بـ$__intervalأو متغيرك المسمى. - متغير مصدر البيانات — يتيح للوحة قيادة واحدة التبديل بين مصادر بيانات Prometheus متعددة (مثل مناطق أو مجموعات مختلفة).
بمجرد تعريف متغير $job، يمكن لكل استعلام لوح الرجوع إليه: rate(http_requests_total{job="$job"}[5m]). يستبدل Grafana الاختيار الحالي قبل إرسال الاستعلام. تدعم المتغيرات اختيار قيم متعددة وخيار الكل — يتوسع اختيار الكل إلى regex يطابق كل قيمة: job=~"service-a|service-b|service-c".
$cluster أولاً، ثم متغير استعلام $namespace يفلتر PromQL الخاص به بـ cluster="$cluster"، ثم $job مفلتراً بالنطاق. يتعمق المستخدمون بشكل طبيعي، وتعرض كل قائمة منسدلة فقط الاختيارات ذات الصلة للاختيارات فوقها — مما يقلل الحمل الإدراكي ويمنع ارتباك "الاستعلام لا يُعيد شيئاً".التزويد: لوحات القيادة ككود
النقر على "حفظ" في واجهة Grafana يخزن JSON لوحة القيادة في قاعدة بيانات Grafana الداخلية. هذا مقبول للتجارب. ليس مقبولاً للإنتاج لأنه يعني أن لوحات قيادتك ليست في التحكم بالإصدارات، وتختلف بين البيئات، وتختفي إذا فُقدت قاعدة بيانات Grafana.
التزويد يحل هذا. يقرأ Grafana ملفات YAML وملفات JSON للوحات القيادة من دليل عند بدء التشغيل (ويراقب التغييرات إذا ضُبط updateIntervalSeconds). أي ملف لوحة قيادة على القرص يأخذ الأولوية ويكتب فوق نسخة قاعدة البيانات — مما يجعل القرص هو مصدر الحقيقة.
تخطيط دليل التزويد:
بهذا في مكانه، تدمج ملفات لوحة القيادة .json في Git إلى جانب بيانات Kubernetes الوصفية أو كود Terraform. يقوم ConfigMap بتركيبها في pod Grafana؛ خط أنابيب GitOps (ArgoCD، Flux) يضمن وجود نفس لوحات القيادة في كل بيئة. يفتح المهندسون PRs لإضافة ألواح — نفس سير عمل المراجعة كالكود.
disableDeletion: true لكن تركت لوحات القيادة قابلة للتعديل ("editable": true في JSON)، يستطيع المستخدمون مع ذلك إجراء تغييرات في واجهة المستخدم — لكن تلك التغييرات ستُكتب فوقها في دورة التزويد التالية. هذا يسبب ارتباكاً وضياع عمل. إما اضبط "editable": false في JSON المزود، أو علّم فريقك أن واجهة المستخدم للقراءة فقط للوحات القيادة المزودة وأن التغييرات يجب أن تمر عبر Git. معظم متاجر التكنولوجيا الكبرى تفرض الأخير.JSON لوحة القيادة وواجهة Grafana CLI
تُصدّر واجهة Grafana لوحات القيادة كـ JSON عبر إعدادات لوحة القيادة ← نموذج JSON. حقلان يجب ضبطهما دائماً قبل الإيداع:
"uid"— معرف ثابت (مثل"service-overview"). بدون UID ثابت، ينشئ Grafana لوحة قيادة جديدة عند الاستيراد بدلاً من تحديث الموجودة، مما يكسر جميع الإشارات المرجعية وروابط التنبيه."version"— اضبطه على1عند إيداع لوحة قيادة جديدة ودع Grafana يزيده؛ لا تزده يدوياً أو ستتعارض التعديلات المتزامنة.
يتيح Grafana CLI (grafana-cli) وHTTP API (/api/dashboards/db) استيراد لوحات القيادة برمجياً — مفيد في خطوط أنابيب CI للتحقق من صحة JSON قبل الدمج.
تصميم الألواح الفعّال للاستخدام أثناء المناوبة
لوحات القيادة المبنية للمناوبة لها متطلبات مختلفة عن تلك المبنية للمراجعات الفصلية. بعض أنماط التكنولوجيا الكبرى التي تصمد أمام حوادث الإنتاج:
- افصل بين لوحات القيادة الشاملة ولوحات التعمق. الشاملة تعرض الإشارات الذهبية الأربع (زمن الاستجابة، حركة المرور، الأخطاء، التشبع) على مستوى الخدمة مع صف واحد لكل خدمة. لوحات التعمق تكشف تفاصيل كل نقطة نهاية أو pod أو تبعية. اربطها بميزة رابط البيانات في Grafana: النقر على ارتفاع في اللوحة الشاملة يفتح لوحة التعمق مفلترة لذلك النطاق الزمني.
- استخدم الحدود واللون بعناية. الأخضر/الأصفر/الأحمر في لوحة الإحصاء يجب أن تتطابق مع حدود SLO الفعلية، وليس الإعدادات الافتراضية التعسفية. لوحة خضراء عند 490 مللي ثانية حين يكون SLO الخاص بك 300 مللي ثانية مضللة بنشاط.
- اضبط فترة التحديث حسب غرض لوحة القيادة. اللوحات التشغيلية: 15-30 ثانية. تخطيط السعة: 5 دقائق. الاتجاه التاريخي: لا تحديث تلقائي. فترة تحديث عدوانية على استعلام كاردينالي عالٍ تُرهق كلاً من Prometheus وGrafana — قس مع مفتش استعلام Grafana قبل ضبط فترات منخفضة.
- أضف تعليقات على النشرات. استخدم Grafana Annotations API أو webhook من خط أنابيب CD لإضافة خطوط عمودية عند أوقات النشر. السبب الجذري الأكثر شيوعاً لتدهور الإنتاج هو "نشرنا شيئاً" — لوحات القيادة المعلّقة تجعل هذا الارتباط فورياً.
تنبيهات Grafana مقابل تنبيهات Prometheus
يمتلك Grafana محرك تنبيهات خاصاً به (Grafana Alerting، المعروف سابقاً بـ Grafana Unified Alerting). للفرق التي تستخدم بالفعل قواعد تنبيه Prometheus وAlertmanager، التوصية هي الإبقاء على منطق التنبيه في Prometheus — إذ يعمل حتى حين يكون Grafana معطلاً ويحتفظ بمنطق التنبيه في YAML محفوظ بالإصدارات إلى جانب قواعد التسجيل. استخدم تنبيهات Grafana فقط لمصادر البيانات التي لا تستطيع Prometheus الوصول إليها (Loki، Tempo، قواعد بيانات SQL). لا تكرر أبداً نفس التنبيه في كلا النظامين.
خط أنابيب التزويد المكتمل — لوحات القيادة في Git، محمولة عبر ConfigMap، تُراقَب بواسطة Grafana، مصدر البيانات يشير إلى واجهة استعلام Thanos، قواعد التنبيه في Prometheus — هو النمط المستخدم عبر مجموعات Kubernetes واسعة النطاق في شركات التكنولوجيا. إنه قابل للتكرار الكامل وقابل للمراجعة ويصمد أمام إعادة تشغيل Grafana أو إعادة بناء المجموعة الكاملة دون تدخل يدوي.