مراقبة بروميثيوس: الإعداد الكامل وممارسات الأفضل

قم بتكوين مراقبة البنية التحتية القوية باستخدام بروميثيوس

Page content

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

مخطط تقني

ما هو Prometheus؟

Prometheus هو أداة مفتوحة المصدر لمراقبة وإرسال التنبيهات، تم تطويرها في البداية في SoundCloud عام 2012، وهو الآن مشروع تخرج من مؤسسة Cloud Native Computing Foundation (CNCF). تم تصميمه خصيصًا لتحقيق الموثوقية والتوسع في البيئات السحابية الديناميكية، مما يجعله الحل المثالي لمراقبة الخدمات الموزعة، والحاويات، والكластرات Kubernetes.

الميزات الرئيسية

قاعدة بيانات السلاسل الزمنية: تخزن Prometheus جميع البيانات كسلسلة زمنية، تُحدد بواسطة أسماء المقاييس ومحطات المفاتيح (العلامات)، مما يتيح إمكانية سؤال قوية ومرنة.

نموذج سحب البيانات: على عكس الأنظمة التقليدية ذات النموذج القائم على الدفع، يقوم Prometheus بسحب المقاييس من الأهداف المُعدة في فترات زمنية محددة، مما يجعله أكثر موثوقية وسهولة في التكوين.

لغة الاستعلام PromQL: تتيح لغة الاستعلام الوظيفية القوية قص وفرز بيانات المقاييس في الوقت الفعلي، مع إمكانية إجراء التجميعات، والتحويلات، والحسابات المعقدة.

اكتشاف الخدمة: اكتشاف تلقائي للأهداف المُراقبة عبر آليات متعددة بما في ذلك Kubernetes، Consul، EC2، والتكوينات الثابتة.

لا تعتمد على المكونات الخارجية: تعمل Prometheus كملف واحد دون أي اعتماديات خارجية مطلوبة، مما يبسط عملية التثبيت ويقلل من تعقيد التشغيل.

تنبيه مدمج: يعالج AlertManager التنبيهات القادمة من Prometheus، مما يوفر تكرارًا، وتقسيمًا، وتحويلًا إلى قنوات الإخطار مثل البريد الإلكتروني، PagerDuty، أو Slack.

مقدمة عن هيكل Prometheus

فهم هيكل Prometheus ضروري للنشر الفعال. تتضمن المكونات الرئيسية:

  • خادم Prometheus: يسحب ويحفظ المقاييس، ويقيّم القواعد، ويقدم الاستعلامات
  • مكتبات العملاء: تُعدّد كود التطبيق لعرض المقاييس
  • الصادرات: تربط الأنظمة الخارجية بتنسيق Prometheus
  • AlertManager: يعالج التنبيهات والإشعارات
  • Pushgateway: يستقبل المقاييس من الوظائف المؤقتة التي لا يمكن سحبها

تدفق البيانات المعتاد: تُعرض تطبيقات المُقاييس نقاط الواجهة → يسحب Prometheus هذه النقاط → تُخزن البيانات في قاعدة بيانات السلاسل الزمنية → تُستخرج وتحليل البيانات عبر استعلامات PromQL → تُنتج التنبيهات بناءً على القواعد → يعالج AlertManager ويوجه الإشعارات.

عند نشر البنية التحتية على Ubuntu 24.04، توفر Prometheus أساسًا ممتازًا لمراقبة شاملة.

تثبيت Prometheus على Ubuntu

لنمشي عبر تثبيت Prometheus على نظام Linux. سنستخدم Ubuntu كمثال، ولكن العملية مشابهة لبقية التوزيعات.

تنزيل وتثبيت

أولًا، أنشئ مستخدمًا مخصصًا لـ Prometheus:

sudo useradd --no-create-home --shell /bin/false prometheus

تنزيل أحدث إصدار من Prometheus:

cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xvf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64

نسخ الملفات الثنائية وإنشاء المجلدات:

sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

sudo cp -r consoles /etc/prometheus
sudo cp -r console_libraries /etc/prometheus
sudo cp prometheus.yml /etc/prometheus/prometheus.yml
sudo chown -R prometheus:prometheus /etc/prometheus

لإدارة الحزم على Ubuntu، راجع دليلنا الشامل إدارة الحزم في Ubuntu.

تكوين Prometheus

تحرير /etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

rule_files:
  - 'alert_rules.yml'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

إنشاء خدمة systemd

إنشاء /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --storage.tsdb.retention.time=30d

[Install]
WantedBy=multi-user.target

تشغيل وتفعيل Prometheus:

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus

قم بالوصول إلى واجهة Prometheus عبر http://localhost:9090.

إعداد Node Exporter

يعرض Node Exporter مقاييس الأجهزة والأنظمة التشغيلية لأنظمة Linux. قم بتثبيته لمراقبة خوادمك:

cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/node_exporter

إنشاء خدمة systemd /etc/systemd/system/node_exporter.service:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

تشغيل Node Exporter:

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

يعرض Node Exporter الآن المقاييس عبر منفذ 9100.

فهم PromQL

PromQL (لغة استعلام Prometheus) هي القلب من استعلام بيانات Prometheus. إليك أنماط الاستعلام الأساسية:

الاستعلامات الأساسية

اختر جميع سلاسل الزمنية للمقاييس:

node_cpu_seconds_total

فلترة حسب العلامة:

node_cpu_seconds_total{mode="idle"}

فلترة متعددة للعلامات:

node_cpu_seconds_total{mode="idle",cpu="0"}

المتجهات الزمنية والتوسيعات

حساب معدل عبر الزمن:

rate(node_cpu_seconds_total{mode="idle"}[5m])

جمع عبر جميع المعالجات:

sum(rate(node_cpu_seconds_total{mode="idle"}[5m]))

تجميع حسب العلامة:

sum by (mode) (rate(node_cpu_seconds_total[5m]))

أمثلة عملية

نسبة استخدام المعالج:

100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

استخدام الذاكرة:

(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

استخدام القرص:

(node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100

معدل حركة المرور الشبكي:

rate(node_network_receive_bytes_total[5m])

نشر Prometheus في Docker

يقدم تشغيل Prometheus في حاويات Docker المرونة وإدارة أسهل:

إنشاء ملف docker-compose.yml:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
    ports:
      - "9090:9090"
    restart: unless-stopped

  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    volumes:
      - '/:/host:ro,rslave'
    ports:
      - "9100:9100"
    restart: unless-stopped

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager
    ports:
      - "9093:9093"
    restart: unless-stopped

volumes:
  prometheus_data:
  alertmanager_data:

تشغيل المجموعة:

docker-compose up -d

مراقبة Kubernetes

يتفوق Prometheus في مراقبة كластرات Kubernetes. يوفر مخطط kube-prometheus-stack Helm حلًا متكاملًا لمراقبة.

تثبيت باستخدام Helm:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack

هذا يثبيت:

  • Prometheus Operator
  • مثيل Prometheus
  • AlertManager
  • Grafana
  • Node Exporter
  • kube-state-metrics
  • لوحات تحكم وتنبيهات مسبقة التكوين

الوصول إلى Grafana:

kubectl port-forward svc/prometheus-grafana 3000:80

الاعتماديات الافتراضية: admin/prom-operator

للموزعات المختلفة من Kubernetes، فإن عملية النشر مشابهة مع تعديلات بسيطة لخصائص المنصات.

إعداد التنبيهات

يتعامل AlertManager مع التنبيهات المرسلة من Prometheus. قم بتكوين قواعد التنبيه والقنوات الإخطار.

قواعد التنبيه

إنشاء /etc/prometheus/alert_rules.yml:

groups:
  - name: system_alerts
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "استخدام المعالج مرتفع على {{ $labels.instance }}"
          description: "استخدام المعالج أعلى من 80% (القيمة الحالية: {{ $value }}%)"

      - alert: HighMemoryUsage
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "استخدام الذاكرة مرتفع على {{ $labels.instance }}"
          description: "استخدام الذاكرة أعلى من 85% (القيمة الحالية: {{ $value }}%)"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 15
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "مساحة القرص منخفضة على {{ $labels.instance }}"
          description: "مساحة القرص المتاحة أقل من 15% على {{ $labels.mountpoint }}"

      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "الخادم {{ $labels.instance }} متوقف"
          description: "الخادم {{ $labels.job }} {{ $labels.instance }} متوقف منذ أكثر من 2 دقيقة"

تكوين AlertManager

إنشاء /etc/prometheus/alertmanager.yml:

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'your-password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'team-email'
  routes:
    - match:
        severity: critical
      receiver: 'team-pagerduty'
    - match:
        severity: warning
      receiver: 'team-slack'

receivers:
  - name: 'team-email'
    email_configs:
      - to: 'team@example.com'
        headers:
          Subject: '{{ .GroupLabels.alertname }}: {{ .Status | toUpper }}'

  - name: 'team-slack'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
        channel: '#alerts'
        title: 'تنبيه: {{ .GroupLabels.alertname }}'
        text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'

  - name: 'team-pagerduty'
    pagerduty_configs:
      - service_key: 'your-pagerduty-key'

التكامل مع Grafana

بينما يحتوي Prometheus على واجهة وبسيطة، تُقدم Grafana رؤية أفضل لخلق لوحات تحكم شاملة.

إضافة Prometheus كمصدر بيانات

  1. افتح Grafana وانتقل إلى التكوين → مصادر البيانات
  2. انقر على “إضافة مصدر بيانات”
  3. اختر “Prometheus”
  4. ضع عنوان URL إلى http://localhost:9090 (أو خادم Prometheus الخاص بك)
  5. انقر على “حفظ واختبار”

أرقام لوحات تحكم شائعة

استيراد لوحات تحكم مُعدة مسبقًا من grafana.com:

  • Node Exporter Full (ID: 1860): مقاييس Linux الشاملة
  • Kubernetes Cluster Monitoring (ID: 7249): ملخص K8s
  • Docker Container Monitoring (ID: 193): مقاييس الحاويات
  • Prometheus Stats (ID: 2): مقاييس Prometheus الداخلية

إنشاء لوحات تحكم مخصصة

أنشئ لوحات باستخدام استعلامات PromQL:

{
  "title": "استخدام المعالج",
  "targets": [{
    "expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
  }]
}

صادرات شائعة

امتد Prometheus المراقبة مع صادرات متخصصة:

Blackbox Exporter

يحقق نقاط الواجهة عبر HTTP، HTTPS، DNS، TCP، وICMP:

scrape_configs:
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://example.com
          - https://api.example.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9115

صادرات قواعد البيانات

  • mysqld_exporter: مقاييس MySQL/MariaDB
  • postgres_exporter: مقاييس PostgreSQL
  • mongodb_exporter: مقاييس MongoDB
  • redis_exporter: مقاييس Redis

صادرات التطبيقات

  • nginx_exporter: مقاييس خادم NGINX
  • apache_exporter: مقاييس خادم Apache HTTP
  • haproxy_exporter: مقاييس موزع الحوافز HAProxy

صادرات السحابة

  • cloudwatch_exporter: مقاييس AWS CloudWatch
  • stackdriver_exporter: مقاييس Google Cloud
  • azure_exporter: مقاييس Azure Monitor

الممارسات الجيدة

الاحتفاظ بالبيانات

قم بتكوين الاحتفاظ المناسب بناءً على احتياجاتك:

--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=50GB

قواعد التسجيل

احسب مسبقًا التعبيرات التي يتم استعلامها بشكل متكرر:

groups:
  - name: example_rules
    interval: 30s
    rules:
      - record: job:node_cpu_utilization:avg
        expr: 100 - (avg by (job) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

إدارة العلامات

  • حافظ على عدد العلامات منخفضًا
  • استخدم مسميات متسقة
  • تجنب العلامات ذات الكثافة العالية (IDs المستخدمين، تواريخ)

الأمان

  • قم بتفعيل المصادقة وHTTPS
  • قم بقيود الوصول إلى واجهة API لـ Prometheus
  • استخدم سياسات الشبكة في Kubernetes
  • قم بتطبيق RBAC للمقاييس الحساسة

التوافر العالي

  • ركز عدة مثيلات لـ Prometheus
  • استخدم Thanos أو Cortex لتخزين المدى الطويل
  • قم بتطبيق التجميع للاعدادات الهرمية

تصحيح المشكلات الشائعة

استخدام الذاكرة المرتفع

  • قلل تكرار عملية السحب
  • قلل فترة الاحتفاظ
  • تحسين استعلامات PromQL
  • قم بتطبيق قواعد تسجيل

مقاييس مفقودة

  • تحقق من حالة الأهداف في /targets
  • تحقق من الاتصال الشبكي
  • تحقق من تكوين السحب
  • تحقق من سجلات صادرات

استعلامات بطيئة

  • استخدم قواعد تسجيل للتوسيعات المعقدة
  • تحسين فلاتر العلامات
  • قلل المدى الزمني
  • أضف الفهارس إذا كنت تستخدم تخزينًا عن بُعد

تحسين الأداء

تحسين الاستعلامات

# سيء: كثافة عالية
sum(rate(http_requests_total[5m]))

# جيد: تجميع حسب العلامات ذات الصلة
sum by (status, method) (rate(http_requests_total[5m]))

حدود الموارد

للنشر في Kubernetes:

resources:
  requests:
    memory: "2Gi"
    cpu: "1000m"
  limits:
    memory: "4Gi"
    cpu: "2000m"

الخاتمة

يوفر Prometheus حلًا قويًا ومُوسّعًا لمراقبة البنية التحتية الحديثة. نموذجه القائم على السحب، ولغة الاستعلام القوية، ونظام صادرات موسّع يجعلاه مثاليًا لمراقبة كل شيء من الخوادم المعدنية إلى الكластرات Kubernetes المعقدة.

بجمع Prometheus مع Grafana لعرض البيانات وAlertManager لإشعارات التنبيه، يمكنك إنشاء منصة مراقبة شاملة قادرة على التعامل مع متطلبات مراقبة المهام الكبيرة. يضمن المجتمع النشط والدعم من مؤسسة CNCF التطوير المستمر والدعم.

ابدأ بجمع المقاييس الأساسية، أضف تدريجيًا صادرات لخدماتك الخاصة، وقم بتحسين قواعد التنبيه بناءً على الخبرة العملية. يتوسع Prometheus مع البنية التحتية الخاصة بك، من النشر على خوادم فردية إلى معمارية مراقبة متعددة المراكز.

الموارد المرتبطة

المراجع الخارجية