مراقبة تطبيقات 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->