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

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

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

وقت القراءة: 18 دقيقة المراقبة
monitoringgrafanaprometheusnetdataمراقبة الخوادمalertdashboard

جدول المحتويات

أدوات مراقبة الخوادم: 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 من لوحة معلومات واحدة. تتيح قواعد التنبيه الكشف الاستباقي عن المشاكل.