مقاييس Prometheus في Go (Golang): دليل شامل
\n\nPrometheus هو نظام مراقبة مفتوح المصدر أصبح المعيار الفعلي لجمع وتحليل المقاييس في بنى الخدمات المصغرة الحديثة. في نظام Go (Golang)، توفر المكتبة prometheus/client_golang مجموعة أدوات قوية ومرنة لتجهيز التطبيقات. في هذه المقالة، سنشرح بالتفصيل كيفية إضافة مقاييس Prometheus إلى تطبيق Go الخاص بك، وإعداد نقاط نهاية HTTP، وإنشاء أنواع مقاييس مخصصة.
التثبيت والإعداد
\n\nللبدء، تحتاج إلى تثبيت العميل الرسمي لـ Prometheus للغة Go:
\n\ngo get github.com/prometheus/client_golang/prometheus\ngo get github.com/prometheus/client_golang/prometheus/promhttp\n\n\nتوفر المكتبة الأولى النواة لإنشاء وتسجيل المقاييس، بينما توفر الثانية معالج HTTP جاهز لنقطة النهاية /metrics.
أنواع المقاييس الأساسية في Prometheus
\n\nيدعم Prometheus أربعة أنواع رئيسية من المقاييس، كل منها مصمم لحل مشاكل محددة:
\n\n- \n
- Counter (عداد) — قيمة متزايدة بشكل رتيب. مثالي لحساب عدد الطلبات، الأخطاء، المهام المنجزة. \n
- Gauge (مقياس) — قيمة يمكن أن تزيد أو تنقص. يُستخدم لدرجة الحرارة الحالية، عدد الاتصالات النشطة، حجم قائمة الانتظار. \n
- Histogram (رسم بياني) — يجمع الملاحظات (مثل وقت تنفيذ الطلب) ويجمعها في "دلاء" (buckets) قابلة للتخصيص. يسمح بحساب القيم الربعية (quantiles). \n
- Summary (ملخص) — يشبه الرسم البياني، لكنه يحسب القيم الربعية على جانب التطبيق. يُوصى به للحالات التي تكون فيها القيم الربعية حاسمة لمنطق الأعمال. \n
مثال عملي: خادم HTTP مع مقاييس
\n\nلنقم بإنشاء تطبيق ويب بسيط يسجل عدد الطلبات، مدتها، وعدد الاتصالات النشطة الحالية.
\n\npackage 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