مراقبة تطبيقات Go: المقاييس والتنبيهات على مستوى متقدم

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

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

ابدأ الدورة

المراقبة المتقدمة لتطبيقات 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:       "زمن استجابة الطلبات (الكميات)",                

المدونات

توصيات الكتب