مراقبة تطبيقات Go: المقاييس والتنبيهات من الألف إلى الياء
\n\nفي تطوير البرمجيات الحديثة، المراقبة ليست رفاهية بل ضرورة. بالنسبة لتطبيقات Go (Golang)، التي تُستخدم غالبًا في الخدمات المصغرة عالية التحميل والمشاريع البنية التحتية، تتيح المراقبة المُعدة بشكل صحيح اكتشاف المشكلات في الوقت المناسب، وتحسين الأداء، وضمان التشغيل المستقر. في هذه المقالة، سنشرح كيفية إعداد مراقبة تطبيقات Go من الصفر: من جمع المقاييس الأساسية إلى إعداد التنبيهات والتصور في Grafana.
\n\nلماذا تعتبر المراقبة مهمة لتطبيقات Go؟
\n\nGo هي لغة مُجمّعة مع دعم مدمج للتزامن. غالبًا ما تعمل تطبيقات Go في أنظمة حيوية: من بوابات API إلى قواعد البيانات. بدون مراقبة، فإنك تخاطر بـ:
\n- \n
- تفويت تسرب الذاكرة أو goroutines \n
- عدم ملاحظة تدهور الأداء \n
- فقدان البيانات بسبب الأخطاء غير المعالجة \n
- التعرض لتوقف العمل بسبب نقص الموارد \n
تمنحك المراقبة الصحيحة صورة كاملة عن صحة التطبيق: من استخدام CPU والذاكرة إلى وقت الاستجابة ومعدل الأخطاء.
\n\nالمقاييس الأساسية لمراقبة Go
\n\nقبل الانتقال إلى الأدوات، دعنا نحدد المقاييس الحيوية لتطبيقات Go:
\n\nالمقاييس النظامية
\n- \n
- CPU usage — تحميل المعالج \n
- Memory usage — استهلاك الذاكرة (بما في ذلك heap و stack) \n
- Goroutines count — عدد goroutines النشطة \n
- GC stats — إحصائيات جامع القمامة (الوقت، عدد الدورات) \n
- Open file descriptors — عدد واصفات الملفات المفتوحة \n
المقاييس التجارية
\n- \n
- Request latency — وقت الاستجابة (p50, p95, p99) \n
- Request rate — عدد الطلبات في الثانية \n
- Error rate — نسبة الأخطاء \n
- Database connection pool — حالة تجمع الاتصالات \n
أدوات مراقبة Go
\n\nالمكدس القياسي لمراقبة تطبيقات Go يشمل:
\n- \n
- Prometheus — نظام جمع وتخزين المقاييس \n
- Grafana — التصور ولوحات المعلومات \n
- Alertmanager — إدارة التنبيهات \n
- مكتبات عميل Go — لتصدير المقاييس \n
إعداد جمع المقاييس في Go باستخدام Prometheus
\n\nلنبدأ بالتطبيق العملي. لتصدير المقاييس من تطبيق Go، سنستخدم المكتبة الرسمية prometheus/client_golang.
الخطوة 1: تثبيت التبعيات
\ngo get github.com/prometheus/client_golang/prometheus\ngo get github.com/prometheus/client_golang/prometheus/promhttp\n\nالخطوة 2: خادم HTTP أساسي مع المقاييس
\n\npackage 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 httpRequestsTotal = prometheus.NewCounterVec(\n prometheus.CounterOpts{\n Name: "http_requests_total",\n Help: "Total number of HTTP requests",\n },\n []string{"method", "endpoint", "status"},\n )\n\n httpRequestDuration = prometheus.NewHistogramVec(\n prometheus.HistogramOpts{\n Name: "http_request_duration_seconds",\n Help: "Histogram of HTTP request durations",\n Buckets: prometheus.DefBuckets,\n },\n []string{"method", "endpoint"},\n )\n)\n\nfunc init() {\n prometheus.MustRegister(httpRequestsTotal)\n prometheus.MustRegister(httpRequestDuration)\n}\n\nfunc main() {\n http.Handle("/metrics", promhttp.Handler())\n \n http.HandleFunc("/api/users", func(w http.ResponseWrit