مراقبة تطبيقات Go (Golang): نظرة شاملة على الأدوات والمكتبات
المراقبة جزء حيوي من تشغيل أي تطبيق خادم. تم تطوير العديد من الأدوات للنظام البيئي Go (Golang) لتتبع الأداء والحالة والأخطاء في الوقت الفعلي. في هذه المقالة، سنستعرض المكتبات والنهج الرئيسية لمراقبة تطبيقات Go، بما في ذلك Prometheus وexpvar وpprof وOpenTelemetry.
لماذا نحتاج إلى مراقبة تطبيقات Go؟
غالبًا ما تُستخدم تطبيقات Go للخدمات الدقيقة عالية التحميل وبوابات API والمعالجات الخلفية. بدون مراقبة، قد تفوتك:
- تسرب الذاكرة والجوروتينات؛
- الطلبات البطيئة والعمليات المحظورة؛
- انخفاض الأداء تحت الحمل؛
- أخطاء الاتصال بقواعد البيانات والخدمات الخارجية.
1. 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: "Duration of HTTP requests in seconds", Buckets: prometheus.DefBuckets, }, []string{"method", "endpoint"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() requestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration) })}
func main() { mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) mux.Handle("/", middleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }))) http.ListenAndServe(":8080", mux)}بعد التشغيل، ستكون المقاييس متاحة على العنوان http://localhost:8080/metrics. سيقوم Prometheus بجمع البيانات من هذه النقطة.
2. expvar — تصدير مقاييس مدمج
تقدم مكتبة Go القياسية حزمة expvar لنشر متغيرات حالة التطبيق. لا تتطلب أي تبعيات خارجية.
مثال على الاستخدام
package main
import ( "expvar" "net/http")
var ( requests = expvar.NewInt("requests_total") errors = expvar.NewInt("errors_total"))
func handler(w http.ResponseWriter, r *http.Request) { requests.Add(1) // محاكاة خطأ if r.URL.Query().Get("error") == "1" { errors.Add(1) w.WriteHeader(http.StatusInternalServerError) return } w.Write([]byte("OK"))}
func main() { http.HandleFunc("/debug/vars", expvar.Handler().ServeHTTP) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}المقاييس متاحة على المسار /debug/vars بتنسيق JSON. للتكامل مع Prometheus، يمكن استخدام <
أيضاً في المكتبة
تكوين تطبيقات PHP: المكتبات والأدوات لإدارة الإعدادات
توليد تقارير PDF باستخدام TypeScript: المكتبات والأدوات
الجيولوكيشن والخرائط في JavaScript (Node.js): المكتبات والأدوات
التعلم الآلي بلغة Go: نظرة عامة على المكتبات والأطر (Golang)