مراقبة وموثوقية المنصة

مقاييس المنصة وSLOs

3 دقيقة للقراءة

تحتاج فرق المنصة لقياس نجاحها بعيدًا عن مقاييس البنية التحتية التقليدية. يغطي هذا الدرس مقاييس DORA ومؤشرات الأداء الرئيسية الخاصة بالمنصة وكيفية تحديد SLOs التي تعكس صحة المنصة وإنتاجية المطورين.

لماذا تهم مقاييس المنصة

مقاييس العمليات التقليدية:
┌─────────────────────────────────────────────────────────┐
│  CPU: 45%  │  الذاكرة: 60%  │  وقت التشغيل: 99.9%      │
│                                                         │
│  "كل شيء يبدو صحيًا... لكن المطورون لا يزالون          │
│   يشكون من بطء النشر"                                  │
└─────────────────────────────────────────────────────────┘

مقاييس المنصة:
┌─────────────────────────────────────────────────────────┐
│  تكرار النشر: 50/يوم                                    │
│  وقت الانتظار للتغييرات: ساعتان                         │
│  معدل فشل التغيير: 5%                                   │
│  وقت الاستعادة: 30 دقيقة                                │
│                                                         │
│  "يمكننا الآن رؤية تجربة المطور الفعلية"               │
└─────────────────────────────────────────────────────────┘

مقاييس DORA

المقاييس الأربعة الرئيسية التي تتنبأ بأداء تسليم البرمجيات:

# تعريف مقاييس DORA
dora_metrics:

  deployment_frequency:
    definition: "كم مرة يُنشر الكود للإنتاج"
    elite: "عدة مرات يوميًا"
    high: "أسبوعيًا إلى شهريًا"
    medium: "شهريًا إلى كل 6 أشهر"
    low: "أقل من مرة كل 6 أشهر"
    measurement: |
      count(deployments) / time_period

  lead_time_for_changes:
    definition: "الوقت من الالتزام إلى الإنتاج"
    elite: "أقل من ساعة"
    high: "يوم إلى أسبوع"
    medium: "أسبوع إلى شهر"
    low: "شهر إلى 6 أشهر"
    measurement: |
      deployment_time - commit_time

  change_failure_rate:
    definition: "نسبة النشر التي تسبب فشلًا"
    elite: "0-15%"
    high: "16-30%"
    medium: "31-45%"
    low: "46-60%"
    measurement: |
      (failed_deployments / total_deployments) * 100

  time_to_restore:
    definition: "وقت التعافي من فشل الإنتاج"
    elite: "أقل من ساعة"
    high: "أقل من يوم"
    medium: "يوم إلى أسبوع"
    low: "أكثر من أسبوع"
    measurement: |
      recovery_time - incident_start_time

مقاييس خاصة بالمنصة

بعد DORA، تتبع مؤشرات خاصة بالمنصة:

# مقاييس صحة المنصة
platform_metrics:

  self_service:
    - name: "معدل تبني الخدمة الذاتية"
      query: |
        (resources_created_via_backstage / total_resources_created) * 100
      target: ">80%"

    - name: "معدل استخدام القوالب"
      query: |
        count(projects_from_templates) / count(total_new_projects)
      target: ">90%"

  infrastructure:
    - name: "وقت توفير البنية التحتية"
      query: |
        avg(time_to_ready) where resource_type="database"
      target: "<10 دقائق"

    - name: "معدل نجاح مزامنة Crossplane"
      query: |
        count(synced_resources) / count(total_resources)
      target: ">99%"

  gitops:
    - name: "حالة مزامنة GitOps"
      query: |
        count(apps where sync_status="Synced") / count(total_apps)
      target: ">99%"

    - name: "معدل التراجع عن النشر"
      query: |
        count(rollbacks) / count(deployments)
      target: "<5%"

  developer_experience:
    - name: "وقت أول نشر"
      description: "الوقت لمطور جديد للنشر"
      target: "<يوم"

    - name: "حجم تذاكر الدعم"
      query: |
        count(platform_support_tickets) / count(developers)
      target: "<0.5 تذكرة/مطور/شهر"

استعلامات Prometheus لـ DORA

تنفيذ مقاييس DORA في Prometheus:

# prometheus-rules-dora.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: dora-metrics
  namespace: monitoring
spec:
  groups:
    - name: dora.metrics
      interval: 1m
      rules:
        # تكرار النشر (يوميًا)
        - record: dora:deployment_frequency:daily
          expr: |
            sum(increase(argocd_app_sync_total{
              phase="Succeeded"
            }[24h])) by (dest_namespace)

        # وقت الانتظار للتغييرات (متوسط بالساعات)
        - record: dora:lead_time_hours:avg
          expr: |
            avg(
              (argocd_app_sync_timestamp - on(app) argocd_app_source_revision_timestamp)
            ) / 3600

        # معدل فشل التغيير (نسبة مئوية)
        - record: dora:change_failure_rate:percent
          expr: |
            (
              sum(increase(argocd_app_sync_total{phase="Failed"}[7d]))
              /
              sum(increase(argocd_app_sync_total[7d]))
            ) * 100

        # متوسط وقت الاستعادة (بالدقائق)
        - record: dora:mttr_minutes:avg
          expr: |
            avg(
              alertmanager_alerts_resolved_total
              - on(alertname) alertmanager_alerts_firing_total
            ) / 60

تحديد SLOs

أهداف مستوى الخدمة لمنصتك:

# slo-definitions.yaml
apiVersion: sloth.slok.dev/v1
kind: PrometheusServiceLevel
metadata:
  name: platform-slos
  namespace: monitoring
spec:
  service: "internal-developer-platform"
  labels:
    team: platform

  slos:
    # توافر API المنصة
    - name: "platform-api-availability"
      objective: 99.9
      description: "Backstage و APIs المنصة متاحة"
      sli:
        events:
          errorQuery: |
            sum(rate(http_requests_total{
              service=~"backstage|crossplane|argocd",
              status=~"5.."
            }[{{.window}}]))
          totalQuery: |
            sum(rate(http_requests_total{
              service=~"backstage|crossplane|argocd"
            }[{{.window}}]))
      alerting:
        name: "PlatformAPIAvailability"
        labels:
          severity: critical
        pageAlert:
          labels:
            severity: page
        ticketAlert:
          labels:
            severity: ticket

    # نجاح توفير البنية التحتية
    - name: "infra-provisioning-success"
      objective: 99.5
      description: "توفير موارد Crossplane ينجح"
      sli:
        events:
          errorQuery: |
            sum(rate(crossplane_managed_resource_sync_total{
              status="failure"
            }[{{.window}}]))
          totalQuery: |
            sum(rate(crossplane_managed_resource_sync_total[{{.window}}]))

    # نجاح مزامنة GitOps
    - name: "gitops-sync-success"
      objective: 99.9
      description: "تطبيقات ArgoCD تزامن بنجاح"
      sli:
        events:
          errorQuery: |
            sum(rate(argocd_app_sync_total{
              phase="Failed"
            }[{{.window}}]))
          totalQuery: |
            sum(rate(argocd_app_sync_total[{{.window}}]))

ميزانيات الخطأ

حساب وتتبع ميزانيات الخطأ:

# حساب ميزانية الخطأ
error_budget:

  formula: |
    error_budget = (1 - SLO) * time_period

    مثال:
    SLO = 99.9%
    الفترة الزمنية = 30 يوم
    ميزانية الخطأ = 0.1% * 30 يوم = 43.2 دقيقة

  tracking: |
    # استعلام Prometheus للميزانية المتبقية
    1 - (
      sum(increase(http_errors_total[30d]))
      /
      sum(increase(http_requests_total[30d]))
    ) / (1 - 0.999)

  policies:
    budget_remaining_high: "متابعة التطوير العادي"
    budget_remaining_low: "إعطاء الأولوية لعمل الموثوقية"
    budget_exhausted: "تجميد الميزات، إصلاح المشاكل"

لوحة Grafana

{
  "dashboard": {
    "title": "لوحة هندسة المنصة",
    "panels": [
      {
        "title": "DORA: تكرار النشر",
        "type": "stat",
        "targets": [{
          "expr": "sum(increase(argocd_app_sync_total{phase=\"Succeeded\"}[24h]))"
        }]
      },
      {
        "title": "DORA: وقت الانتظار (ساعات)",
        "type": "gauge",
        "targets": [{
          "expr": "dora:lead_time_hours:avg"
        }]
      },
      {
        "title": "DORA: معدل فشل التغيير",
        "type": "gauge",
        "targets": [{
          "expr": "dora:change_failure_rate:percent"
        }]
      },
      {
        "title": "SLO المنصة: التوافر",
        "type": "gauge",
        "targets": [{
          "expr": "1 - (sum(rate(http_requests_total{status=~\"5..\"}[30d])) / sum(rate(http_requests_total[30d])))"
        }]
      },
      {
        "title": "ميزانية الخطأ المتبقية",
        "type": "stat",
        "targets": [{
          "expr": "platform_error_budget_remaining_percent"
        }]
      }
    ]
  }
}

في الدرس التالي، سنستكشف مقاييس تجربة المطور وكيفية قياس تبني المنصة. :::

اختبار

الوحدة 5: مراقبة وموثوقية المنصة

خذ الاختبار