مراقبة تطبيقات Go: 3 أدوات لتسجيل الأحداث والتتبع

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

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

ابدأ الدورة

لماذا يصمت تطبيق Go الخاص بك وكيف تصلح ذلك؟

\n

لقد كتبت خدمة مصغرة مثالية بلغة Go. إنها تجتاز جميع الاختبارات، تبدأ بسرعة وتستهلك القليل من الذاكرة. تقوم بنشرها في الإنتاج - وبعد ساعة يشتكي المستخدمون من البطء. تدخل إلى الخادم، تنظر إلى الطرفية الفارغة وتدرك: التطبيق صامت. لا توجد سجلات، لا توجد مقاييس، لا يوجد فهم لما حدث بشكل خاطئ.

\n

موقف مألوف؟ مرحباً بك في عالم المراقبة (observability) لتطبيقات Go. بدون مراقبة وتسجيل أحداث، الكود الخاص بك هو صندوق أسود. اليوم سنشرح كيفية تحويله إلى نظام شفاف، حيث يكون كل تأخير وكل خطأ واضحاً كوضوح الشمس.

\n

سأعرض لك ثلاث أدوات عملية، أمثلة كود حقيقية بلغة Go، وسأقدم لك قائمة مرجعية ستنقذ إنتاجك. هيا بنا!

\n\n

1. تسجيل الأحداث المنظم: كيف تتوقف عن الكتابة في وحدة التحكم وتبدأ الحياة

\n

استخدام fmt.Println("خطأ:", err) الساذج هو من الماضي. في تسجيل أحداث Go الحديث، نحتاج إلى نظام: تنسيق JSON، مستويات (debug, info, warn, error)، وحقول للبحث. تعرف على الملك - مكتبة zap من Uber.

\n\n

لماذا zap بالتحديد؟

\n
    \n
  • السرعة: إنه أسرع من log القياسي بمقدار 10-100 مرة تحت الأحمال العالية.
  • \n
  • الهيكل: تضيف مفاتيح وقيم، بدلاً من لصق السلاسل بعلامة الجمع.
  • \n
  • المرونة: يمكنك الكتابة إلى ملف، إلى stdout، إلى Elasticsearch - في أي مكان.
  • \n
\n\n

التثبيت ومثال أساسي

\n
go get -u go.uber.org/zap
\n\n

كود مسجل بسيط:

\n
package 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", "***") للبيانات الحساسة.

\n\n

2. المقاييس والمراقبة: تحويل الكود إلى لوحة تحكم

\n

السجلات جيدة، لكنها تتحدث عن الماضي. المقاييس هي نبض تطبيقك في الوقت الفعلي. بالنسبة لمراقبة تطبيقات Go، المعيار الفعلي هو Prometheus + مكتبة العميل الخاصة به.

\n\n

ماذا تقيس؟

\n
    \n
  • RPS (طلبات في الثانية) - الحمل على الخدمة.
  • \n
  • زمن الاستجابة (p50, p95, p99) - وقت الاستجابة.
  • \n
  • معدل الخطأ - نسبة الأخطاء.
  • \n
  • Goroutines - تسربات الغوروتين.
  • \n
  • الذاكرة / المعالج - الموارد.
  • \n
\n\n

مثال: إضافة مقاييس لخادم HTTP

\n
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    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                

المدونات

توصيات الكتب