مراقبة تطبيقات 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