مراقبة تطبيقات Go: المقاييس والتنبيهات على المستوى المتقدم
\nتتطلب تطبيقات Go الحديثة ليس فقط أداءً عاليًا، بل أيضًا مراقبة موثوقة. جمع المقاييس الأساسية (CPU، الذاكرة، الطلبات) هو مجرد الخطوة الأولى. على المستوى المتقدم، من الضروري تطبيق مقاييس مخصصة، وإعداد تنبيهات بناءً على منطق الأعمال، وضمان تحمل الأخطاء. في هذه المقالة، سننظر في كيفية تنفيذ مراقبة شاملة لتطبيقات Go باستخدام Prometheus و Grafana والتنبيهات المخصصة.
\n\n1. جمع المقاييس المتقدم في Go باستخدام Prometheus
\nتتيح المكتبة prometheus/client_golang جمع ليس فقط المقاييس القياسية، بل أيضًا المقاييس المخصصة. لنلق نظرة على مثال لإعداد جامع مقاييس مخصص لخادم HTTP.
package main\n\nimport (\n "net/http"\n "github.com/prometheus/client_golang/prometheus"\n "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n requestDuration = prometheus.NewHistogramVec(\n prometheus.HistogramOpts{\n Name: "http_request_duration_seconds",\n Help: "مدة تنفيذ طلبات HTTP.",\n Buckets: prometheus.DefBuckets,\n },\n []string{"method", "path", "status"},\n )\n activeRequests = prometheus.NewGauge(\n prometheus.GaugeOpts{\n Name: "http_active_requests_total",\n Help: "العدد الحالي للطلبات النشطة.",\n },\n )\n)\n\nfunc init() {\n prometheus.MustRegister(requestDuration)\n prometheus.MustRegister(activeRequests)\n}\n\nfunc metricsMiddleware(next http.Handler) http.Handler {\n return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n activeRequests.Inc()\n defer activeRequests.Dec()\n\n timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) {\n requestDuration.WithLabelValues(r.Method, r.URL.Path, "200").Observe(v)\n }))\n defer timer.ObserveDuration()\n\n next.ServeHTTP(w, r)\n })\n}\n\nfunc main() {\n mux := http.NewServeMux()\n mux.Handle("/metrics", promhttp.Handler())\n mux.Handle("/api", metricsMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n w.Write([]byte("Hello, Go!"))\n })))\n http.ListenAndServe(":8080", mux)\n}\n\nفي هذا المثال، نقوم بإنشاء مدرج تكراري (histogram) لمدة الطلبات ومقياس (gauge) للطلبات النشطة. استخدام الوسوم (labels) يسمح بتفصيل المقاييس حسب الطرق والمسارات والحالات.
\n\n2. إعداد التنبيهات بناءً على منطق الأعمال
\nيجب ألا تكون التنبيهات تقنية فقط (ارتفاع تحميل CPU)، بل تجارية أيضًا. على سبيل المثال، تجاوز وقت الاستجابة لنقطة نهاية حرجة أو انخفاض عدد المعاملات الناجحة. تكوين التنبيهات في Prometheus (ملف alerts.yml):
groups:\n - name: go_app_alerts\n rules:\n - alert: HighRequestLatency\n expr: http_request_duration_seconds{job="go-app"} > 1.0\n for: 5m\n labels:\n severity: critical\n annotations:\n summary: "زمن استجابة الطلب مرتفع ({{ $value }}s)"\n description: "نقطة النهاية {{ $labels.path }} لديها زمن استجابة يتجاوز ثانية واحدة لمدة 5 دقائق."\n\n - alert: ActiveRequestsSurge\n expr: http_active_requests_total{job="go-app"} > 100\n for: 2m\n labels:\n severity: warning\n annotations:\n summary: "ارتفاع في الطلبات النشطة ({{ $value }})"\n description: "عدد الطلبات النشطة تجاوز 100 خلال دقيقتين."\n\n - alert: ErrorRateHigh\n expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1\n for: 10m\n labels:\n severity: critical\n annotations:\n summary: "معدل أخطاء 5xx مرتفع"\n description: "معدل الأخطاء يتجاوز 10% خلال آخر 10 دقائق."\n\nلاحظ استخدام