الرئيسية قاعدة المعرفة الشبكات والاتصالات مراقبة الأنظمة: Prometheus وGrafana لمراقبة صحة الخوادم والتطبيقات
الشبكات والاتصالات

مراقبة الأنظمة: Prometheus وGrafana لمراقبة صحة الخوادم والتطبيقات

لماذا المراقبة مهمة قبل أن يشتكي أحد؟

مستشعر في المصنع يتوقف عن إرسال البيانات. قاعدة بيانات تصل إلى 95% من سعة القرص. زمن استجابة التطبيق يتضاعف. بدون المراقبة، تكتشف هذه المشاكل عندما يتصل مشغّل الآلة أو يتوقف خط الإنتاج.

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

Prometheus: جمع المقاييس

Prometheus قاعدة بيانات سلاسل زمنية تجمع المقاييس من تطبيقاتك على فترات منتظمة.

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    restart: unless-stopped
  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"
    restart: unless-stopped
volumes:
  prometheus-data:

ملف الإعدادات

# prometheus/prometheus.yml
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'factory-monitor'
    static_configs:
      - targets: ['factory-app:8080']
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']

Grafana: لوحات مراقبة جميلة وحيّة

Grafana تحوّل المقاييس الخام إلى لوحات مرئية يفهمها أي شخص في أرضية المصنع.

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=monitor2025
    restart: unless-stopped

استعلامات PromQL مفيدة

اللوحة الاستعلام
استهلاك المعالج 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
استهلاك الذاكرة node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
معدل طلبات HTTP rate(http_requests_total[5m])
زمن الاستجابة P95 histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

الإنذارات التلقائية: Alertmanager

اللوحات عديمة الفائدة إذا لم يكن أحد يراقبها في الثانية صباحاً. Alertmanager يرسل إشعارات عندما تتجاوز المقاييس حدوداً محددة.

# prometheus/alert-rules.yml
groups:
  - name: factory-alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) < 0.1
        for: 10m
        labels:
          severity: critical
      - alert: ApplicationDown
        expr: up{job="factory-monitor"} == 0
        for: 1m
        labels:
          severity: critical
# alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
route:
  receiver: 'factory-team'
receivers:
  - name: 'factory-team'
    webhook_configs:
      - url: 'http://factory-app:8080/api/alerts'

مقاييس التطبيق المخصصة

تطبيق Rust يمكنه كشف مقاييس مخصصة باستخدام صندوق prometheus:

use prometheus::{IntCounter, Histogram, register_int_counter, register_histogram};
use lazy_static::lazy_static;

lazy_static! {
    static ref SENSOR_READINGS: IntCounter = register_int_counter!(
        "sensor_readings_total",
        "Total number of sensor readings processed"
    ).unwrap();
    static ref PROCESSING_TIME: Histogram = register_histogram!(
        "sensor_processing_seconds",
        "Time spent processing sensor data"
    ).unwrap();
}

async fn process_sensor_data(data: SensorData) {
    let timer = PROCESSING_TIME.start_timer();
    // معالجة البيانات...
    SENSOR_READINGS.inc();
    timer.observe_duration();
}

نقطة نهاية المقاييس

use axum::{Router, routing::get};
use prometheus::TextEncoder;

async fn metrics_handler() -> String {
    let encoder = TextEncoder::new();
    let metric_families = prometheus::gather();
    encoder.encode_to_string(&metric_families).unwrap()
}

let app = Router::new().route("/metrics", get(metrics_handler));

مثال عملي: مراقبة تطبيق Rust + SurrealDB

services:
  factory-app:
    build: .
    ports: ["8080:8080"]
    environment:
      - DATABASE_URL=ws://surrealdb:8000
    depends_on: [surrealdb]
    restart: unless-stopped
  surrealdb:
    image: surrealdb/surrealdb:v2.1.4
    command: start --user root --pass factory123 surrealkv://data/factory.db
    volumes: [surreal-data:/data]
    restart: unless-stopped
  prometheus:
    image: prom/prometheus:latest
    ports: ["9090:9090"]
    volumes:
      - ./prometheus:/etc/prometheus:ro
      - prometheus-data:/prometheus
    restart: unless-stopped
  grafana:
    image: grafana/grafana:latest
    ports: ["3000:3000"]
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
    restart: unless-stopped
  alertmanager:
    image: prom/alertmanager:latest
    ports: ["9093:9093"]
    volumes: [./alertmanager:/etc/alertmanager:ro]
    restart: unless-stopped
  node-exporter:
    image: prom/node-exporter:latest
    ports: ["9100:9100"]
    restart: unless-stopped
volumes:
  surreal-data:
  prometheus-data:
  grafana-data:

الخلاصة

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

Prometheus Grafana monitoring metrics alerts observability المراقبة المقاييس لوحة المراقبة الإنذارات الرصد صحة النظام