مراقبة تطبيقات C++: المقاييس والتنبيهات للإنتاج

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

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

ابدأ الدورة

مقدمة: لماذا تعتبر مراقبة تطبيقات C++ أمرًا حاسمًا للاستقرار؟



تطبيقات C++ الحديثة تعمل في بيئات عالية التحميل: خوادم الألعاب، الأنظمة المالية، أجهزة إنترنت الأشياء والحلول المدمجة. بدون مراقبة مناسبة، حتى الكود المكتوب بشكل مثالي يمكن أن يؤدي إلى عواقب كارثية — من تسرب الذاكرة إلى انهيار الخدمة بالكامل في الساعة 3 صباحًا. في هذه المقالة، سنشرح كيفية إعداد مراقبة كاملة لتطبيقات C++: ما هي المقاييس التي يجب جمعها، وكيفية تنظيم التسجيل وإعداد التنبيهات، لتتمكن من النوم بسلام.



1. المقاييس الرئيسية لتطبيقات C++



تبدأ مراقبة تطبيقات C++ باختيار المقاييس الصحيحة. سنقسمها إلى ثلاث مجموعات:



1.1. مقاييس النظام (OS-level)

  • CPU Usage — استخدام المعالج بالنسبة المئوية والوقت في وضع المستخدم/النواة.
  • Memory Usage — RSS (Resident Set Size)، الذاكرة الافتراضية، عدد أخطاء الصفحات.
  • Disk I/O — عمليات القراءة/الكتابة على القرص (مهم بشكل خاص لقواعد البيانات).
  • Network I/O — عدد البايتات المرسلة/المستلمة، عدد الأخطاء.


1.2. مقاييس التطبيق (Application-level)

  • Request latency — وقت معالجة الطلبات (p50, p95, p99).
  • Throughput — عدد الطلبات المعالجة في الثانية.
  • Error rate — نسبة الأخطاء (الاستثناءات، المهلات).
  • Connection pool — عدد الاتصالات النشطة/المنتظرة.


1.3. مقاييس بيئة تشغيل C++

  • Memory allocation — عدد استدعاءات new/delete، تخصيصات الذاكرة في الكومة.
  • Thread count — عدد الخيوط النشطة، كشف الجمود.
  • Object pool utilization — النسبة المئوية للكائنات المشغولة في التجمع.


مثال على تصدير المقاييس عبر عميل Prometheus بلغة C++:



#include <prometheus/exposer.h>#include <prometheus/registry.h>#include <prometheus/counter.h>#include <prometheus/gauge.h>

using namespace prometheus;

int main() { // إنشاء خادم HTTP للمقاييس Exposer exposer{"0.0.0.0:8080"}; auto registry = std::make_shared<Registry>();

// عداد الطلبات auto& request_counter = BuildCounter() .Name("http_requests_total") .Help("Total number of HTTP requests") .Register(*registry);

// Gauge للعدد الحالي للخيوط auto& thread_gauge = BuildGauge() .Name("app_thread_count") .Help("Current number of active threads") .Register(*registry);

// تسجيل المقاييس exposer.RegisterCollectable(registry);

// محاكاة عمل التطبيق while (true) { request_counter.Increment(); thread_gauge.Set(5.0); // قيمة مثال std::this_thread::sleep_for(std::chrono::seconds(1)); }}


2. أدوات جمع المقاييس: Prometheus و Grafana



لجمع المقاييس في نظام C++ البيئي، المعيار الفعلي هو Prometheus مع Grafana. Prometheus هو نظام سحب: تطبيقك يقدم المقاييس عبر HTTP، و Prometheus نفسه يسحبها بفاصل زمني محدد.



2.1. إعداد تصدير المقاييس في C++

المكتبات الشائعة:

  • prometheus-cpp (عميل C++ الرسمي لـ Prometheus).
  • opentelemetry-cpp — للتتبع والمقاييس (أكثر حداثة).
  • NanoMsg + custom exporter — للأنظمة المدمجة.


مثال على التكامل مع Prometheus-cpp (الكود الكامل أعلاه). بعد التشغيل، تحقق من نقطة النهاية:



curl http://localhost:8080/metrics

# HELP http_requests_total Total number of HTTP requests# TYPE http_requests_total counterhttp_reques

المدونات

توصيات الكتب