مقدمة: لماذا تعتبر المراقبة أمرًا بالغ الأهمية لتطبيقات Go
اكتسبت لغة Go (Golang) شعبية في تطوير الخدمات المصغرة عالية التحميل وبوابات API والأدوات الشبكية بسبب أدائها وبساطتها. ومع ذلك، حتى أكثر التطبيقات استقرارًا قد تواجه تسربًا للذاكرة أو تعليقًا لمؤشرات goroutine أو ارتفاعات مفاجئة في زمن الاستجابة. وهنا تأتي المراقبة للإنقاذ - وهي ممارسة أساسية في هندسة موثوقية المواقع (SRE).
في هذه المقالة، سنستكشف كيفية إعداد المراقبة لتطبيقات Go باستخدام مجموعة Prometheus + Grafana، وما هي المقاييس التي يجب جمعها أولاً، وكيفية تكوين التنبيهات لمنع الحوادث. ستكون المادة مفيدة لكل من مطوري Go المبتدئين والمهندسين ذوي الخبرة الذين يسعون لتحسين قابلية مراقبة خدماتهم.
1. المقاييس الرئيسية لتطبيق Go
قبل إعداد المراقبة، من المهم فهم المقاييس الحيوية لخدمة Go. يمكن تقسيمها إلى ثلاث فئات:
1.1. مقاييس بيئة تشغيل Go
توفر بيئة تشغيل Go معلومات غنية عن حالة التطبيق. باستخدام حزمة runtime والمُصدر القياسي expvar، يمكنك الحصول على بيانات حول:
- عدد goroutines (
runtime.NumGoroutine()) — الزيادة الحادة تشير إلى تسرب في goroutine. - استخدام الذاكرة (
runtime.ReadMemStats()) — راقبAllocوHeapInuseوGCStats. - وقت جمع القمامة (GC) — إذا استغرق GC أكثر من 5% من الوقت، فهذه إشارة للتحسين.
- عدد استدعاءات النظام — قد يشير إلى حظر.
1.2. مقاييس الأعمال
لفهم صحة الخدمة، من الضروري مراقبة مؤشرات الأعمال:
- RPS (طلب في الثانية) — عدد الطلبات في الثانية.
- زمن الاستجابة (P50, P95, P99) — تأخيرات معالجة الطلبات.
- معدل الأخطاء — النسبة المئوية للأخطاء (5xx, 4xx).
- عدد الاتصالات النشطة (قاعدة البيانات، واجهات برمجة التطبيقات الخارجية).
1.3. مقاييس البنية التحتية
لا تنسَ مقاييس النظام: وحدة المعالجة المركزية (CPU)، الذاكرة، الإدخال/الإخراج للقرص، حزم الشبكة. فهي تساعد في التمييز بين مشاكل التطبيق ومشاكل المضيف.
2. التكامل مع Prometheus: تصدير المقاييس
يعتبر Prometheus المعيار الفعلي لجمع المقاييس في عالم Go. دعنا نلقي نظرة على التكامل خطوة بخطوة.
2.1. تثبيت عميل Prometheus للغة Go
أضف التبعية إلى ملف go.mod الخاص بك:
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttp2.2. إنشاء مقاييس مخصصة
مثال على إنشاء عداد طلبات ومدرج تكراري لوقت الاستجابة:
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", "status"}, ) 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) prometheus.MustRegister(requestDuration)}
func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ResponseWriter: w, statusCode: http.Stat