مراقبة تطبيقات Go (Golang): المكتبات والأدوات

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

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

ابدأ الدورة

مراقبة تطبيقات Go (Golang): من المقاييس إلى التنميط



Go (Golang) هي لغة صُممت لتطبيقات الخادم عالية التحميل. ومع ذلك، حتى الكود الأكثر أداءً قد يواجه أعطالاً، أو تسرباً في الذاكرة، أو تأخيراً غير مبرر. بدون مراقبة، فإنك تخاطر بمعرفة المشكلة فقط من المستخدمين الغاضبين. في هذه المقالة، سنستعرض المكتبات والأدوات الرئيسية لمراقبة تطبيقات Go: من جمع المقاييس إلى التتبع والتنميط.



لماذا تراقب تطبيق Go؟

  • الأداء: تتبع وقت الاستجابة، عدد goroutines، استخدام CPU والذاكرة.
  • الموثوقية: مراقبة الأخطاء، حالات الذعر (panics)، عدد مرات إعادة التشغيل.
  • التوسع: فهم متى تحتاج إلى إضافة نسخ مكررة.
  • مقاييس الأعمال: عدد الطلبات، المستخدمون النشطون، حجم البيانات المعالجة.


1. الحزمة المدمجة expvar

أبسط طريقة هي expvar. توفر نقطة نهاية HTTP مع مقاييس أساسية: عدد goroutines، استخدام الذاكرة، وقت التشغيل. مناسبة للبدء السريع.

package main

import ( "expvar" "net/http")

var requestCount = expvar.NewInt("requests_total")

func handler(w http.ResponseWriter, r *http.Request) { requestCount.Add(1) w.Write([]byte("Hello, Go!"))}

func main() { http.HandleFunc("/", handler) // المقاييس متاحة على العنوان /debug/vars http.ListenAndServe(":8080", nil)}

قم بتشغيل التطبيق وافتح http://localhost:8080/debug/vars — سترى JSON مع المقاييس.



2. Prometheus + prometheus/client_golang

Prometheus هو المعيار الفعلي لجمع المقاييس في Go. تتيح مكتبة prometheus/client_golang تسجيل مقاييس مخصصة: عدادات، رسوم بيانية، ملخصات.

package main

import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")

var ( httpRequests = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, []string{"method", "path"}, ))

func init() { prometheus.MustRegister(httpRequests)}

func handler(w http.ResponseWriter, r *http.Request) { httpRequests.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("OK"))}

func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}

نقطة النهاية /metrics تُخرج البيانات بتنسيق يفهمه Prometheus. بعد ذلك، يمكنك إعداد لوحات المعلومات في Grafana.



3. التنميط باستخدام pprof

حزمة net/http/pprof تضيف نقاط نهاية للتنميط: CPU، الذاكرة، الأقفال، goroutines. هذه أداة لا غنى عنها للعثور على الاختناقات.

package main

import ( "net/http" _ "net/http/pprof" // تضمين أداة التنميط)

func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("التنميط نشط")) }) http.ListenAndServe(":6060", nil)}

يمكنك الآن تشغيل:

go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

سيقوم هذا بجمع ملف تعريف CPU لمدة 30 ثانية. قم بتحليله في الوضع التفاعلي أو قم بتصديره إلى SVG/PDF.



4. OpenTelemetry — التتبع والمقاييس

OpenTelemetry (OTel) هو المعيار الحديث للمراقبة. فهو يجمع بين المقاييس والسجلات والتتبعات. بالنسبة لـ Go، هناك SDK رسمي go.opentelemetry.io/otel.

package main

import ( "context" "log" "net/http" "go.opentelemetry.io

توصيات