المراقبة المتقدمة لتطبيقات Go: من المقاييس إلى التنبيهات
في التطوير الحديث باستخدام Go (Golang)، لا يكفي التسجيل الأساسي وفحص الصحة (Health Check). بالنسبة لأنظمة الإنتاج، هناك حاجة إلى مراقبة عميقة (observability): جمع المقاييس المخصصة، تصديرها إلى Prometheus، التصور في Grafana والتنبيهات التلقائية. في هذه المقالة، سنتناول المستوى المتقدم لمراقبة تطبيقات Go — من بنية المقاييس إلى إعداد التنبيهات بناءً على منطق الأعمال.
بنية المراقبة: Prometheus + Go
المكدس القياسي للمراقبة لتطبيقات Go يشمل:
- Prometheus — نظام لجمع وتخزين المقاييس (نموذج السحب pull).
- عميل Go لـ Prometheus (
prometheus/client_golang) — مكتبة لتصدير المقاييس. - Grafana — تصور لوحات المعلومات.
- Alertmanager — إدارة التنبيهات (البريد الإلكتروني، Slack، Telegram).
يجب أن يوفر تطبيق Go نقطة نهاية HTTP (عادةً /metrics)، التي يسحب منها Prometheus البيانات. دعنا ننظر في الإعداد الأساسي.
package main
import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
func main() { // تسجيل المقاييس القياسية لـ Go (وقت التشغيل، جامع القمامة، الغوروتينات) prometheus.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) prometheus.MustRegister(prometheus.NewGoCollector())
http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}بتشغيل التطبيق، ستحصل على مقاييس قياسية: go_goroutines، process_cpu_seconds_total، go_memstats_alloc_bytes وغيرها. ولكن للمراقبة المتقدمة، هذا غير كافٍ — نحتاج إلى مقاييس مخصصة.
إنشاء مقاييس مخصصة: Gauge، Counter، Histogram
يدعم Prometheus أربعة أنواع رئيسية من المقاييس. دعنا ننظر إليها باستخدام مثال تطبيق Go يعالج طلبات HTTP.
Counter (عداد) — عدد الأحداث
يُستخدم لحساب الطلبات، الأخطاء، تنفيذ المهام.
var requestCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "إجمالي عدد طلبات HTTP", }, []string{"method", "endpoint", "status"},)
func init() { prometheus.MustRegister(requestCounter)}
func handler(w http.ResponseWriter, r *http.Request) { // معالجة الطلب requestCounter.WithLabelValues(r.Method, r.URL.Path, "200").Inc()}Gauge (مقياس) — القيم الحالية
مثالي لمراقبة قوائم الانتظار، مجمعات الاتصالات، درجة الحرارة.
var queueSize = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "task_queue_size", Help: "الحجم الحالي لقائمة انتظار المهام", },)
func addToQueue() { queueSize.Inc()}
func processFromQueue() { queueSize.Dec()}Histogram (مدرج تكراري) — توزيع القيم
يُستخدم لقياس وقت الاستجابة أو حجم البيانات.
var requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "مدرج تكراري لوقت معالجة الطلبات", Buckets: prometheus.DefBuckets, // 0.005, 0.01, 0.025, 0.05, ... }, []string{"endpoint"},)
func measureRequest(endpoint string, duration float64) { requestDuration.WithLabelValues(endpoint).Observe(duration)}Summary (ملخص) — الكميات (Quantiles)
يشبه المدرج التكراري، لكنه يحسب الكميات الدقيقة (p50، p95، p99).
var requestLatency = prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "http_request_latency_seconds", Help: "زمن استجابة الطلبات (الكميات)",