لماذا يصمت تطبيق Go الخاص بك وكيف تصلح ذلك؟
\nلقد كتبت خدمة مصغرة مثالية بلغة Go. إنها تجتاز جميع الاختبارات، تبدأ بسرعة وتستهلك القليل من الذاكرة. تقوم بنشرها في الإنتاج - وبعد ساعة يشتكي المستخدمون من البطء. تدخل إلى الخادم، تنظر إلى الطرفية الفارغة وتدرك: التطبيق صامت. لا توجد سجلات، لا توجد مقاييس، لا يوجد فهم لما حدث بشكل خاطئ.
\nموقف مألوف؟ مرحباً بك في عالم المراقبة (observability) لتطبيقات Go. بدون مراقبة وتسجيل أحداث، الكود الخاص بك هو صندوق أسود. اليوم سنشرح كيفية تحويله إلى نظام شفاف، حيث يكون كل تأخير وكل خطأ واضحاً كوضوح الشمس.
\nسأعرض لك ثلاث أدوات عملية، أمثلة كود حقيقية بلغة Go، وسأقدم لك قائمة مرجعية ستنقذ إنتاجك. هيا بنا!
\n\n1. تسجيل الأحداث المنظم: كيف تتوقف عن الكتابة في وحدة التحكم وتبدأ الحياة
\nاستخدام fmt.Println("خطأ:", err) الساذج هو من الماضي. في تسجيل أحداث Go الحديث، نحتاج إلى نظام: تنسيق JSON، مستويات (debug, info, warn, error)، وحقول للبحث. تعرف على الملك - مكتبة zap من Uber.
لماذا zap بالتحديد؟
\n- \n
- السرعة: إنه أسرع من
logالقياسي بمقدار 10-100 مرة تحت الأحمال العالية. \n - الهيكل: تضيف مفاتيح وقيم، بدلاً من لصق السلاسل بعلامة الجمع. \n
- المرونة: يمكنك الكتابة إلى ملف، إلى stdout، إلى Elasticsearch - في أي مكان. \n
التثبيت ومثال أساسي
\ngo get -u go.uber.org/zap\n\nكود مسجل بسيط:
\npackage main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n logger, _ := zap.NewProduction()\n defer logger.Sync() // تفريغ المخزن المؤقت قبل الخروج\n\n logger.Info("تم تشغيل الخدمة",\n zap.String("env", "production"),\n zap.Int("port", 8080),\n )\n\n // مثال مع خطأ\n err := someFunction()\n if err != nil {\n logger.Error("فشل تنفيذ العملية",\n zap.Error(err),\n zap.String("module", "database"),\n )\n }\n}\n\nفي الناتج، تحصل على JSON نظيف:
\n{"level":"info","ts":1700000000.123,"msg":"تم تشغيل الخدمة","env":"production","port":8080}\n\nالآن، أي أداة مثل Kibana أو Grafana Loki ستتمكن من تحليل هذه السجلات حسب الحقول. هل تريد العثور على جميع الأخطاء في وحدة "database" خلال الساعة الأخيرة؟ نقرة واحدة.
\n\nنصيحة: لا تسجل الأسرار وبيانات التعريف الشخصية (PII)
\nأضف فحصاً: إذا كان الحقل يحتوي على كلمة مرور أو بريد إلكتروني - قم بإخفائه. استخدم zap.String("user", "***") للبيانات الحساسة.
2. المقاييس والمراقبة: تحويل الكود إلى لوحة تحكم
\nالسجلات جيدة، لكنها تتحدث عن الماضي. المقاييس هي نبض تطبيقك في الوقت الفعلي. بالنسبة لمراقبة تطبيقات Go، المعيار الفعلي هو Prometheus + مكتبة العميل الخاصة به.
\n\nماذا تقيس؟
\n- \n
- RPS (طلبات في الثانية) - الحمل على الخدمة. \n
- زمن الاستجابة (p50, p95, p99) - وقت الاستجابة. \n
- معدل الخطأ - نسبة الأخطاء. \n
- Goroutines - تسربات الغوروتين. \n
- الذاكرة / المعالج - الموارد. \n
مثال: إضافة مقاييس لخادم HTTP
\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 requestCount = 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 requestDuration = prometheus.NewHistogramVec(\n prometheus.HistogramOpts{\n Name: "http_request