مقاييس Prometheus في Go (Golang): دليل شامل للمراقبة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقاييس Prometheus في Go (Golang): دليل شامل

\n\n

Prometheus هو نظام مراقبة مفتوح المصدر أصبح المعيار الفعلي لجمع وتحليل المقاييس في بنى الخدمات المصغرة الحديثة. في نظام Go (Golang)، توفر المكتبة prometheus/client_golang مجموعة أدوات قوية ومرنة لتجهيز التطبيقات. في هذه المقالة، سنشرح بالتفصيل كيفية إضافة مقاييس Prometheus إلى تطبيق Go الخاص بك، وإعداد نقاط نهاية HTTP، وإنشاء أنواع مقاييس مخصصة.

\n\n

التثبيت والإعداد

\n\n

للبدء، تحتاج إلى تثبيت العميل الرسمي لـ Prometheus للغة Go:

\n\n
go get github.com/prometheus/client_golang/prometheus\ngo get github.com/prometheus/client_golang/prometheus/promhttp\n
\n\n

توفر المكتبة الأولى النواة لإنشاء وتسجيل المقاييس، بينما توفر الثانية معالج HTTP جاهز لنقطة النهاية /metrics.

\n\n

أنواع المقاييس الأساسية في Prometheus

\n\n

يدعم Prometheus أربعة أنواع رئيسية من المقاييس، كل منها مصمم لحل مشاكل محددة:

\n\n
    \n
  • Counter (عداد) — قيمة متزايدة بشكل رتيب. مثالي لحساب عدد الطلبات، الأخطاء، المهام المنجزة.
  • \n
  • Gauge (مقياس) — قيمة يمكن أن تزيد أو تنقص. يُستخدم لدرجة الحرارة الحالية، عدد الاتصالات النشطة، حجم قائمة الانتظار.
  • \n
  • Histogram (رسم بياني) — يجمع الملاحظات (مثل وقت تنفيذ الطلب) ويجمعها في "دلاء" (buckets) قابلة للتخصيص. يسمح بحساب القيم الربعية (quantiles).
  • \n
  • Summary (ملخص) — يشبه الرسم البياني، لكنه يحسب القيم الربعية على جانب التطبيق. يُوصى به للحالات التي تكون فيها القيم الربعية حاسمة لمنطق الأعمال.
  • \n
\n\n

مثال عملي: خادم HTTP مع مقاييس

\n\n

لنقم بإنشاء تطبيق ويب بسيط يسجل عدد الطلبات، مدتها، وعدد الاتصالات النشطة الحالية.

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n    "time"\n\n    "github.com/prometheus/client_golang/prometheus"\n    "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n    // عداد الطلبات مع تسميات "method" و "endpoint"\n    requestCounter = prometheus.NewCounterVec(\n        prometheus.CounterOpts{\n            Name: "http_requests_total",\n            Help: "Total number of HTTP requests",\n        },\n        []string{"method", "endpoint"},\n    )\n\n    // رسم بياني لمدة الطلبات\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request_duration_seconds",\n            Help:    "Histogram of request duration in seconds",\n            Buckets: prometheus.DefBuckets, // [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]\n        },\n        []string{"method", "endpoint"},\n    )\n\n    // مقياس الاتصالات النشطة\n    activeConnections = prometheus.NewGauge(\n        prometheus.GaugeOpts{\n            Name: "http_active_connections",\n            Help: "Current number of active connections",\n        },\n    )\n)\n\nfunc init() {\n    // تسجيل المقاييس في سجل Prometheus\n    prometheus.MustRegister(requestCounter)\n    prometheus.MustRegister(requestDuration)\n    prometheus.MustRegister(activeConnections)\n}\n\n// الوسيطة (middleware) تغلف كل طلب HTTP لجمع المقاييس\nfunc metricsMiddleware(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        // زيادة عداد الاتصالات النشطة\n        activeConnections.Inc()\n        defer activeConnections.Dec()\n\n        start := time.Now()\n        next.ServeHTTP(w, r)\n        duration := time.Since(start).Seconds()\n\n        // تسجيل مقاييس الطلب\n        requestCounter.WithLabelVal                    

توصيات