Prometheus وGrafana

لوحات قيادة Grafana

18 دقيقة الدرس 8 من 32

لوحات قيادة Grafana

Prometheus هو محرك بيانات — يجمع ويخزن ويقيّم مقاييس السلاسل الزمنية بكفاءة لا هوادة فيها. لكن محطة أوامر مليئة بنتائج PromQL ليست الطريقة التي يكشف بها البشر تدهور مستويات خدمة SLO أو يتواصلون بصحة النظام عبر جسر المواجهة. Grafana هي طبقة التصور والذكاء التشغيلي التي تحول بيانات Prometheus الخام إلى لوحات القيادة التي تستخدمها فرق الهندسة فعلاً تحت الضغط. يتناول هذا الدرس كيفية هندسة Grafana، وبناء الألواح والمتغيرات التي تتوسع عبر مئات الخدمات، وما هو أهم — كيفية إدارة لوحات القيادة ككود حتى تعيش ما بعد المهندس الذي أنشأها.

كيف يتصل Grafana بـ Prometheus

يعامل Grafana مصادر البيانات ككائنات قابلة للتوصيل من الدرجة الأولى. مصدر بيانات Prometheus يُضبط مرة واحدة — يشير إلى Prometheus أو واجهة استعلام Thanos/Cortex — ثم يُشار إليه بكل لوح عبر جميع لوحات القيادة. كل لوح يطلق استعلام PromQL على ذلك المصدر ويعرض النتيجة كرسم بياني للسلاسل الزمنية، أو إحصاء، أو مؤشر، أو جدول، أو خريطة حرارية، أو مخطط أعمدة.

الشيء الحاسم أن Grafana هو طبقة استعلام خالصة: يرسل PromQL إلى Prometheus عند الطلب (أو على فترة التحديث التي تضبطها) ويعرض ما يعود. لا يخزن أي بيانات مقاييس بنفسه. هذا مهم للهندسة المعمارية: يمكن إعادة تشغيل Grafana بأمان، وتوسيعه أفقياً، أو استبداله دون المساس بتخزين المقاييس. يمكن لنسخ Grafana متعددة أن تشير إلى نفس Prometheus وتعرض لوحات قيادة مطابقة.

الفكرة الأساسية: في الإعدادات واسعة النطاق (Google وUber وNetflix) يمر مسار استعلام Grafana عبر واجهة استعلام — Thanos Query أو Cortex — وليس مباشرةً إلى Prometheus واحد. هذا غير مرئي لـ Grafana: عنوان URL لمصدر البيانات يشير فقط إلى الواجهة. معرفة هذا مهمة حين تضبط مهل الاستعلام ورؤوس الذاكرة المؤقتة.

تشريح لوحة القيادة

لوحة قيادة 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 Dashboard Architecture: Variables, Panels, and Data Sources Grafana Variables: $cluster $namespace $job Request Rate rate(http_requests_total {job="$job"}[5m]) Time Series Error Rate rate(errors_total {job="$job"}[5m]) Stat + Threshold p99 Latency histogram_quantile(0.99, rate(…_bucket[5m])) Gauge Active Instances count(up{job="$job"}==1) Stat Prometheus (or Thanos Query) PromQL time series Provisioning dashboards/ my-service.json datasources/ prometheus.yaml
يحل Grafana متغيرات القوالب إلى PromQL، يستعلم Prometheus (أو واجهة Thanos/Cortex)، ويعرض النتائج كألواح مكتوبة. تُحمّل لوحات القيادة ومصادر البيانات من القرص عند بدء التشغيل عبر التزويد.

التزويد: لوحات القيادة ككود

النقر على "حفظ" في واجهة Grafana يخزن JSON لوحة القيادة في قاعدة بيانات Grafana الداخلية. هذا مقبول للتجارب. ليس مقبولاً للإنتاج لأنه يعني أن لوحات قيادتك ليست في التحكم بالإصدارات، وتختلف بين البيئات، وتختفي إذا فُقدت قاعدة بيانات Grafana.

التزويد يحل هذا. يقرأ Grafana ملفات YAML وملفات JSON للوحات القيادة من دليل عند بدء التشغيل (ويراقب التغييرات إذا ضُبط updateIntervalSeconds). أي ملف لوحة قيادة على القرص يأخذ الأولوية ويكتب فوق نسخة قاعدة البيانات — مما يجعل القرص هو مصدر الحقيقة.

تخطيط دليل التزويد:

# /etc/grafana/provisioning/ # datasources/prometheus.yaml ← تعريف مصادر البيانات # dashboards/default.yaml ← إخبار Grafana أين توجد ملفات JSON # /var/lib/grafana/dashboards/ ← ملفات JSON للوحات القيادة الفعلية # datasources/prometheus.yaml apiVersion: 1 datasources: - name: Prometheus type: prometheus uid: prometheus-prod # UID ثابت — تشير إليه الألواح url: http://thanos-query:9090 access: proxy isDefault: true jsonData: timeInterval: "15s" # يطابق فترة scrape الخاصة بك queryTimeout: "60s" httpMethod: POST # POST يدعم استعلامات أكبر (Thanos) # dashboards/default.yaml apiVersion: 1 providers: - name: default orgId: 1 folder: "Services" type: file disableDeletion: true # منع حذف لوحات القيادة المزودة عبر واجهة المستخدم updateIntervalSeconds: 30 # إعادة تحميل فورية عند تغيير ملفات JSON على القرص options: path: /var/lib/grafana/dashboards

بهذا في مكانه، تدمج ملفات لوحة القيادة .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 قبل الدمج.

# التحقق من صحة JSON لوحة القيادة (خطوة CI) باستخدام Grafana API curl -sf \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $GRAFANA_SA_TOKEN" \ -X POST http://grafana:3000/api/dashboards/db \ --data-binary @dashboards/my-service.json \ | jq '.status' # → "success" عند JSON صالح؛ خروج غير صفري عند خطأ # تصدير لوحة قيادة للتحكم بالإصدارات (استبدل UID والرمز المميز): curl -s \ -H "Authorization: Bearer $GRAFANA_SA_TOKEN" \ "http://grafana:3000/api/dashboards/uid/service-overview" \ | jq '.dashboard' > dashboards/service-overview.json # تركيب لوحات القيادة في pod Grafana عبر Kubernetes ConfigMap: # (مقطع من ملف قيم Helm أو بيان خام) # # extraConfigmapMounts: # - name: dashboards # configMap: grafana-dashboards # mountPath: /var/lib/grafana/dashboards # readOnly: true

تصميم الألواح الفعّال للاستخدام أثناء المناوبة

لوحات القيادة المبنية للمناوبة لها متطلبات مختلفة عن تلك المبنية للمراجعات الفصلية. بعض أنماط التكنولوجيا الكبرى التي تصمد أمام حوادث الإنتاج:

  • افصل بين لوحات القيادة الشاملة ولوحات التعمق. الشاملة تعرض الإشارات الذهبية الأربع (زمن الاستجابة، حركة المرور، الأخطاء، التشبع) على مستوى الخدمة مع صف واحد لكل خدمة. لوحات التعمق تكشف تفاصيل كل نقطة نهاية أو pod أو تبعية. اربطها بميزة رابط البيانات في Grafana: النقر على ارتفاع في اللوحة الشاملة يفتح لوحة التعمق مفلترة لذلك النطاق الزمني.
  • استخدم الحدود واللون بعناية. الأخضر/الأصفر/الأحمر في لوحة الإحصاء يجب أن تتطابق مع حدود SLO الفعلية، وليس الإعدادات الافتراضية التعسفية. لوحة خضراء عند 490 مللي ثانية حين يكون SLO الخاص بك 300 مللي ثانية مضللة بنشاط.
  • اضبط فترة التحديث حسب غرض لوحة القيادة. اللوحات التشغيلية: 15-30 ثانية. تخطيط السعة: 5 دقائق. الاتجاه التاريخي: لا تحديث تلقائي. فترة تحديث عدوانية على استعلام كاردينالي عالٍ تُرهق كلاً من Prometheus وGrafana — قس مع مفتش استعلام Grafana قبل ضبط فترات منخفضة.
  • أضف تعليقات على النشرات. استخدم Grafana Annotations API أو webhook من خط أنابيب CD لإضافة خطوط عمودية عند أوقات النشر. السبب الجذري الأكثر شيوعاً لتدهور الإنتاج هو "نشرنا شيئاً" — لوحات القيادة المعلّقة تجعل هذا الارتباط فورياً.
ممارسة احترافية: احتفظ بمراجعة "صحة لوحة القيادة" في دورة SRE الفصلية. احذف الألواح التي لا ينظر إليها أحد، وحدّث الاستعلامات التي تشير إلى أسماء مقاييس مهملة، وتحقق من أن كل تنبيه في Alertmanager يرتبط بلوح لوحة القيادة الصحيح. لوحات القيادة تتدهور أسرع من كود التطبيق — تتراكم الألواح غير المستخدمة، وتنكسر الاستعلامات حين تتغير أسماء المقاييس، ويتوقف مهندسو المناوبة عن الوثوق بلوحات قيادة لا يستطيعون قراءتها تحت الضغط.

تنبيهات 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 أو إعادة بناء المجموعة الكاملة دون تدخل يدوي.

ES
Edrees Salih
منذ ساعة

We are still cooking the magic in the way!