انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

أدوات مراقبة الخوادم: Grafana و Prometheus و Netdata

إعداد حزمة Prometheus + Grafana، Netdata، node_exporter، قواعد التنبيه، إنشاء لوحات المعلومات ومراقبة مقاييس الخادم.

وقت القراءة: 18 دقيقة المراقبة
monitoringgrafanaprometheusnetdataمراقبة الخوادمalertdashboard
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

أدوات مراقبة الخوادم: Grafana و Prometheus و Netdata

مراقبة البنية التحتية للخوادم بشكل فعال أمر ضروري للكشف المبكر عن مشاكل الأداء ومنع فترات التوقف. في هذا الدليل، سنقوم بإعداد نظام شامل لمراقبة الخوادم باستخدام Prometheus و Grafana و Netdata.

ما هو Prometheus؟

Prometheus هو نظام مفتوح المصدر لجمع المقاييس والمراقبة مدعوم من Cloud Native Computing Foundation (CNCF). بفضل بنيته القائمة على السحب (Pull)، يقوم بجمع المقاييس بانتظام من الأنظمة المستهدفة عبر HTTP وتخزينها في قاعدة بيانات السلاسل الزمنية.

الميزات الرئيسية لـ Prometheus:

  • PromQL: لغة استعلام قوية لتحليل المقاييس
  • نموذج السحب: جمع المقاييس من الأهداف عبر HTTP
  • اكتشاف الخدمات: اكتشاف تلقائي للأهداف (Kubernetes، Consul، DNS)
  • مدير التنبيهات: إدارة التنبيهات بناءً على الشروط
  • بيانات متعددة الأبعاد: نموذج بيانات مرن قائم على التسميات
  • الاتحاد: ربط هرمي لعدة خوادم Prometheus

تثبيت Node Exporter

Node Exporter هو مُصدّر Prometheus يجمع مقاييس الأجهزة ونظام التشغيل من خوادم Linux.

التثبيت مع Systemd

hljs bash
# تحميل Node Exporter
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz

# نقل الملف التنفيذي
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/

# إنشاء مستخدم
sudo useradd --no-create-home --shell /bin/false node_exporter

# ملف خدمة systemd
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \\
  --collector.systemd \\
  --collector.processes \\
  --web.listen-address=:9100

[Install]
WantedBy=multi-user.target
EOF

# بدء الخدمة
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter

Node Exporter مع Docker

hljs yaml
# docker-compose.yml
version: '3.8'
services:
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'

التحقق من المقاييس:

hljs bash
curl http://localhost:9100/metrics | head -50

تثبيت Prometheus

حزمة Prometheus مع Docker Compose

hljs yaml
# docker-compose.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
      - '--web.enable-lifecycle'

volumes:
  prometheus_data:

تكوين Prometheus

hljs yaml
# prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  scrape_timeout: 10s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

rule_files:
  - "alert_rules.yml"

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

  - job_name: 'node-exporter'
    static_configs:
      - targets:
          - 'node-exporter:9100'
          - '192.168.1.10:9100'
          - '192.168.1.11:9100'
        labels:
          env: 'production'

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

aكتشف الحالات الحرجة باستخدام قواعد تنبيه Prometheus:

hljs yaml
# prometheus/alert_rules.yml
groups:
  - name: server_alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "استخدام عالي لوحدة المعالجة ({{ $labels.instance }})"
          description: "استخدام CPU يبلغ {{ $value | printf \"%.1f\" }}% - أعلى من 85% لمدة 5 دقائق."

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "استخدام عالي للذاكرة ({{ $labels.instance }})"
          description: "استخدام الذاكرة يبلغ {{ $value | printf \"%.1f\" }}% - أعلى من 90%."

      - alert: DiskAlmostFull
        expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 85
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "القرص ممتلئ تقريباً ({{ $labels.instance }})"
          description: "{{ $labels.mountpoint }} استخدام القرص {{ $value | printf \"%.1f\" }}%"

      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "الخادم غير متاح ({{ $labels.instance }})"
          description: "{{ $labels.job }} الهدف غير متاح منذ دقيقتين."

إعداد Alertmanager

hljs yaml
# alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'telegram'

receivers:
  - name: 'telegram'
    telegram_configs:
      - bot_token: 'رمز_البوت_الخاص_بك'
        chat_id: معرف_المحادثة
        parse_mode: 'HTML'
        message: |
          <b>{{ .Status | toUpper }}</b>
          <b>تنبيه:</b> {{ .CommonLabels.alertname }}
          <b>الخطورة:</b> {{ .CommonLabels.severity }}
          <b>الخادم:</b> {{ .CommonLabels.instance }}

تثبيت Grafana

Grafana مع Docker Compose

hljs yaml
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=كلمة_مرور_قوية123!
      - GF_USERS_ALLOW_SIGN_UP=false

volumes:
  grafana_data:

لوحات معلومات Grafana الشائعة

# Node Exporter Full Dashboard
Dashboard ID: 1860
مصدر البيانات: Prometheus

# Docker Container Monitoring
Dashboard ID: 893

# Prometheus Stats
Dashboard ID: 2

استعلامات PromQL مخصصة

hljs promql
# نسبة استخدام CPU
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# نسبة استخدام RAM
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# نسبة استخدام القرص
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100

# حركة الشبكة (بايت/ثانية)
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])

# وقت تشغيل النظام
node_time_seconds - node_boot_time_seconds

تثبيت Netdata

Netdata هي أداة مراقبة خوادم في الوقت الفعلي. التثبيت سهل للغاية ويوفر مقاييس مفصلة فوراً.

التثبيت بأمر واحد

hljs bash
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
sudo systemctl status netdata

واجهة الويب: http://عنوان_IP_الخادم:19999

Netdata مع Docker

hljs yaml
version: '3.8'
services:
  netdata:
    image: netdata/netdata:latest
    container_name: netdata
    restart: unless-stopped
    ports:
      - "19999:19999"
    cap_add:
      - SYS_PTRACE
      - SYS_ADMIN
    security_opt:
      - apparmor:unconfined
    volumes:
      - netdataconfig:/etc/netdata
      - netdatalib:/var/lib/netdata
      - netdatacache:/var/cache/netdata
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
  netdataconfig:
  netdatalib:
  netdatacache:

حزمة المراقبة الكاملة (Docker Compose)

hljs yaml
# docker-compose.monitoring.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    networks:
      - monitoring

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    depends_on:
      - prometheus
    networks:
      - monitoring

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"
    networks:
      - monitoring

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    restart: unless-stopped
    ports:
      - "9093:9093"
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

volumes:
  prometheus_data:
  grafana_data:
hljs bash
docker compose -f docker-compose.monitoring.yml up -d

من خلال إعداد حزمة Prometheus + Grafana + Netdata، يمكنك مراقبة البنية التحتية الكاملة لخوادم REXE من لوحة معلومات واحدة. تتيح قواعد التنبيه الكشف الاستباقي عن المشاكل.

الأسئلة الشائعة

ما الفرق بين Prometheus و Netdata، أيهما يجب أن أستخدم؟

Prometheus مثالي لجمع المقاييس والتخزين طويل المدى مع استعلامات PromQL القوية. Netdata محسّن للمراقبة في الوقت الفعلي وسهل التثبيت جداً. أفضل نهج هو استخدام كليهما معاً: Netdata للمراقبة الفورية والكشف السريع عن المشاكل، Prometheus + Grafana لتحليل الاتجاهات طويلة المدى ولوحات المعلومات المخصصة.

كيف أستورد لوحات معلومات Grafana؟

انتقل إلى Dashboards → Import في واجهة Grafana. انسخ معرف لوحة المعلومات من grafana.com/grafana/dashboards (مثلاً 1860 لـ Node Exporter Full). أدخل المعرف، انقر Load، اختر مصدر بيانات Prometheus وانقر Import.

Prometheus يستخدم مساحة قرص كبيرة جداً، ماذا أفعل؟

قلل فترة الاحتفاظ: '--storage.tsdb.retention.time=15d'. زد فترة الجمع (30 ثانية بدلاً من 15). فلتر المقاييس غير الضرورية باستخدام metric_relabel_configs. استخدم Admin API لحذف البيانات القديمة: 'curl -X POST http://localhost:9090/api/v1/admin/tsdb/clean_tombstones'.

إشعارات Alertmanager لا تصل، كيف أقوم بالتصحيح؟

أولاً تحقق من أن التنبيهات تعمل في Prometheus: http://localhost:9090/alerts. تأكد من أن Alertmanager يعمل: http://localhost:9093/#/alerts. تحقق من ملف التكوين: 'amtool check-config alertmanager.yml'. تأكد من صحة رمز البوت ومعرف المحادثة.

ما المقاييس التي يجمعها Node Exporter؟

يجمع Node Exporter استخدام CPU والذاكرة ومساحة القرص والإدخال/الإخراج وحركة الشبكة وحمل النظام ونظام الملفات ووقت التشغيل وعدد العمليات وواصفات الملفات المفتوحة والمزيد. يمكن تفعيل جامعات إضافية: --collector.systemd و --collector.processes و --collector.tcpstat.

كيف أراقب عدة خوادم من Grafana واحد؟

ثبّت Node Exporter على كل خادم (المنفذ 9100). أضف جميع الخوادم تحت scrape_configs في تكوين Prometheus. في لوحات Grafana يمكنك تصفية الخوادم حسب تسمية instance. لعدد كبير من الخوادم، يمكنك التوسع باستخدام Prometheus federation أو Thanos.

مقالات ذات صلة

حركة الشبكةالداخل Gbpsالخارج Gbps