مراقبة تطبيقات Go (Golang): الأدوات والمكتبات
المراقبة جزء لا يتجزأ من تشغيل أي خدمة في بيئة الإنتاج. بالنسبة لتطبيقات Go (Golang)، تقدم البيئة حلولاً مدمجة وأدوات خارجية قوية. في هذه المقالة، سنستعرض الأساليب الرئيسية: من التنميط الأساسي إلى جمع المقاييس والتتبع.
1. الوسائل المدمجة: حزمة expvar
توفر حزمة expvar نقطة نهاية HTTP بسيطة لنشر متغيرات حالة التطبيق. لا تتطلب تبعيات خارجية وهي مثالية للتشخيص السريع.
التوصيل والاستخدام
package main
import ( "expvar" "net/http")
var requestsCount = expvar.NewInt("total_requests")
func handler(w http.ResponseWriter, r *http.Request) { requestsCount.Add(1) w.Write([]byte("OK"))}
func main() { http.HandleFunc("/api", handler) // نقطة النهاية /debug/vars ستكون متاحة تلقائياً http.ListenAndServe(":8080", nil)}بعد التشغيل، انتقل إلى /debug/vars - سترى JSON يحتوي على المقاييس، بما في ذلك عداد الطلبات وبيانات GC والذاكرة.
2. Prometheus - المعيار الفعلي للمقاييس
Prometheus هو أشهر نظام مراقبة لـ Go. تتيح مكتبة prometheus/client_golang تصدير المقاييس بتنسيق يفهمه خادم Prometheus.
التثبيت
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpمثال: عداد ومدرج تكراري
package main
import ( "net/http" "time"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( requestCount = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint"}, ) requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogram of request durations", Buckets: prometheus.DefBuckets, }, []string{"method"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func handler(w http.ResponseWriter, r *http.Request) { start := time.Now() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("Hello")) requestDuration.WithLabelValues(r.Method).Observe(time.Since(start).Seconds())}
func main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}سيقوم Prometheus بجمع المقاييس من نقطة النهاية /metrics. يمكنك إضافة تنبيهات في Alertmanager بناءً على هذه البيانات.
3. التنميط باستخدام pprof
تضيف حزمة net/http/pprof نقاط نهاية للتطبيق لتنميط وحدة المعالجة المركزية والذاكرة والغوروتينات والأقفال. هذه أداة لا غنى عنها للعثور على الاختناقات.
بداية سريعة
package main
import ( "log" "net/http" _ "net/http/pprof" // يسجل المعالجات)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, pprof!")) }) log.Fatal(http.ListenAndServe(":6060", nil))}الآن نقاط النهاية المتاحة:
/debug/pprof/- قائمة التنميطات/debug/pprof/profile- تنميط وحدة المعالجة المركزية/debug/pprof/heap- تنميط الذاكرة/debug/pprof/goroutine- أكوام الغوروتينات
قم بتحليل التنميطات باستخدام الأمر go tool pprof أو عن طريق