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

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

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

ابدأ الدورة

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

توصيات