مراقبة تطبيقات Rust: المقاييس والتنبيهات (مستوى متقدم)

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

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

ابدأ الدورة

مقدمة: لماذا تعتبر المراقبة أمرًا حيويًا لتطبيقات Rust في الإنتاج

\n\n

Rust هي لغة برمجة أنظمة تشتهر بأدائها وأمانها. ومع ذلك، حتى تطبيق Rust الأكثر موثوقية الذي يعمل تحت أحمال عالية قد يواجه تسربات للذاكرة، أو انخفاضًا في الأداء، أو حالات ذعر غير متوقعة. بدون مراقبة عالية الجودة، فإنك تخاطر باكتشاف المشكلات فقط بعد أن تؤثر على المستخدمين.

\n\n

في هذا الدليل، سنستعرض تقنيات متقدمة لمراقبة تطبيقات Rust: من جمع المقاييس المخصصة إلى إعداد التنبيهات في الوقت الفعلي. ستتعلم كيفية دمج Prometheus وGrafana وOpenTelemetry في نظامك البيئي على Rust، وكذلك كيفية كتابة تنبيهات فعالة لا تُحدث "ضوضاء" دون داع.

\n\n

1. القياس المتقدم باستخدام Prometheus والمقاييس المخصصة

\n\n

عادةً ما يقتصر التكامل الأساسي لـ Prometheus في Rust على استخدام crate prometheus. ومع ذلك، تتطلب أنظمة الإنتاج ضبطًا أكثر دقة. دعنا نرى كيفية إضافة مقاييس مخصصة مع المدرجات التكرارية والتجميع، وكذلك كيفية إدارة تسجيلها بشكل صحيح.

\n\n

1.1. إنشاء سجل مقاييس مخصص

\n\n

تجنب استخدام السجل العام (global registry) لأنه يعقد الاختبار وقد يؤدي إلى تعارض في الأسماء. استخدم Registry خاصًا بك:

\n\n
use prometheus::{Registry, CounterVec, HistogramVec, Opts};\nuse std::sync::Arc;\n\n#[derive(Clone)]\npub struct AppMetrics {\n    pub request_counter: CounterVec,\n    pub request_duration: HistogramVec,\n    registry: Registry,\n}\n\nimpl AppMetrics {\n    pub fn new() -> Result<Self, Box<dyn std::error::Error>> {\n        let registry = Registry::new();\n\n        let request_counter = CounterVec::new(\n            Opts::new("app_requests_total", "Total number of requests")\n                .namespace("myapp"),\n            &["method", "endpoint", "status"]\n        )?;\n\n        let request_duration = HistogramVec::new(\n            Opts::new("app_request_duration_seconds", "Request duration in seconds")\n                .namespace("myapp"),\n            &["method", "endpoint"]\n        )?;\n\n        registry.register(Box::new(request_counter.clone()))?;\n        registry.register(Box::new(request_duration.clone()))?;\n\n        Ok(Self { request_counter, request_duration, registry })\n    }\n\n    pub fn gather(&self) -> prometheus::Result<Vec<prometheus::proto::MetricFamily>> {\n        self.registry.gather()\n    }\n}
\n\n

1.2. استخدام المدرجات التكرارية للحصول على نسب مئوية دقيقة

\n\n

تسمح المدرجات التكرارية (Histograms) بتتبع توزيع زمن الاستجابة. قم بضبط الحاويات (buckets) وفقًا لحملك:

\n\n
use prometheus::HistogramOpts;\n\nlet buckets = vec![0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0];\n\nlet request_duration = HistogramVec::new(\n    HistogramOpts::new(\n        "app_request_duration_seconds",\n        "Request duration in seconds"\n    )\n    .buckets(buckets),\n    &["method", "endpoint"]\n)?;
\n\n

في Grafana، ستتمكن من الحصول على قيم دقيقة لـ p50 وp95 وp99 باستخدام دوال histogram_quantile.

\n\n

2. إعداد التنبيهات: من الفوضى إلى الهدوء

\n\n

التنبيهات السيئة أسوأ من عدم وجودها. فهي تُحدث "ضوضاء" وتجعل الفريق يتجاهل الإشارات المهمة حقًا. دعنا نستعرض استراتيجية متقدمة للتنبيهات لتطبيقات Rust.

\n\n

2.1. قاعدة "الإشارة الذهبية"

\n\n

لكل خدمة مصغرة على Rust، يجب عليك مراقبة أربع إشارات رئيسية:

\n
    \n
  • Latency (زمن الاستجابة) — وقت معالجة الطلب
  • \n
  • Traffic (حركة المرور) — عدد الطلبات في الثانية
  • \n
  • Errors (الأخطاء) — النسبة المئوية للطلبات الفاشلة
  • \n
  • Saturation (الإشباع) — تحميل وحدة المعالجة المركزية، الذاكرة، عدد الاتصالات النشطة

المدونات

توصيات الكتب