مراقبة تطبيقات C++: الأدوات والمكتبات

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

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

ابدأ الدورة

مراقبة تطبيقات C++: لماذا وكيف تفعل ذلك



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



1. جمع مقاييس النظام: Prometheus Client for C++



إذا كان تطبيقك يعمل كخدمة مصغرة أو جزء من نظام موزع، فأنت بحاجة إلى بنية تحتية لجمع المقاييس. Prometheus هو المعيار الفعلي. بالنسبة لـ C++، يوجد عميل رسمي prometheus-cpp.



تتيح المكتبة إنشاء عدادات، رسوم بيانية، مقاييس إجمالية (Summary) وعرضها عبر نقطة نهاية HTTP التي سيقوم خادم Prometheus باستقصائها.



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

int main() { using namespace prometheus;

// إنشاء خادم HTTP على المنفذ 8080 Exposer exposer{"0.0.0.0:8080"};

// تسجيل المقاييس auto registry = std::make_shared<Registry>(); auto& counter_family = BuildCounter() .Name("http_requests_total") .Help("Total number of HTTP requests") .Register(*registry);

auto& counter = counter_family.Add({{"method", "GET"}, {"endpoint", "/api"}});

// عرض المقاييس exposer.RegisterCollectable(registry);

// محاكاة الطلبات for (int i = 0; i < 100; ++i) { counter.Increment(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); }

return 0;}


المزايا:

  • تكامل أصلي مع نظام Prometheus/Grafana البيئي
  • دعم الرسوم البيانية والكميات
  • تصدير غير متزامن دون حظر الخيط الرئيسي

العيوب:

  • يتطلب إعداد خادم Prometheus و Grafana للتصور
  • غير مناسب للأنظمة المضمنة ذات الذاكرة المحدودة


2. تنميط الأداء: Google Benchmark



لقياس وقت تنفيذ أجزاء معينة من الكود بدقة (المعايير)، استخدم Google Benchmark. هذه ليست مراقبة في الوقت الفعلي، لكنها أداة لا غنى عنها لاختبار أداء الانحدار.



#include <benchmark/benchmark.h>

static void BM_StringCreation(benchmark::State& state) { for (auto _ : state) { std::string empty_string; }}BENCHMARK(BM_StringCreation);

static void BM_StringCopy(benchmark::State& state) { std::string x = "hello"; for (auto _ : state) { std::string copy(x); }}BENCHMARK(BM_StringCopy);

BENCHMARK_MAIN();


الإمكانيات:

  • حساب تلقائي للمتوسط، الوسيط، الانحراف المعياري
  • دعم المعايير متعددة الخيوط
  • إنشاء تقارير بتنسيق JSON، CSV، وحدة التحكم
  • التكامل مع CI/CD (يمكن مقارنة النتائج بالنتائج المرجعية)


3. التسجيل: spdlog



السجلات هي أساس مراقبة الأخطاء والشذوذ. spdlog هي أسرع مكتبة تسجيل لـ C++ (header-only، وضع غير متزامن).



#include <spdlog/spdlog.h>#include <spdlog/sinks/basic_file_sink.h>

int main() { // إنشاء مسجل مع الكتابة إلى ملف auto logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");

// تعيين مستوى التسجيل spdlog::set_level(spdlog::level::info);

// سجلات بمستويات مختلفة logger->info("تم تشغيل التطبيق، الإصدار {}", 1.0); logger->warn("الذاكرة قريبة من الحد: {} MB", 512); logger->

توصيات