مكتبة prometheus-cpp: جمع مقاييس Prometheus في تطبيقات C++
\n\nفي تطوير البرمجيات الحديثة، تلعب مراقبة حالة التطبيقات دورًا حاسمًا. Prometheus هو نظام مراقبة وتنبيه مفتوح المصدر يجمع المقاييس من الأهداف عبر نقاط نهاية HTTP. لدمج Prometheus في مشاريع C++، توجد مكتبة قوية ومرنة تسمى prometheus-cpp. تتيح هذه المكتبة للمطورين إضافة جمع المقاييس (عدادات، مقاييس، رسوم بيانية) بسهولة إلى كودهم وتصديرها بتنسيق يفهمه خادم Prometheus.
ما هي prometheus-cpp؟
\n\nprometheus-cpp هي مكتبة عميل لـ Prometheus، مكتوبة بلغة C++17. توفر جميع الأدوات اللازمة لإنشاء وتحديث وتصدير المقاييس. تدعم المكتبة ثلاثة أنواع رئيسية من المقاييس، كما هو محدد في نموذج بيانات Prometheus:
- \n
- Counter (عداد) — قيمة متزايدة بشكل رتيب (مثل عدد الطلبات، الأخطاء، المهام المنجزة). \n
- Gauge (مقياس) — قيمة يمكن أن تزيد وتنقص بشكل عشوائي (مثل درجة الحرارة الحالية، عدد الاتصالات النشطة). \n
- Histogram (رسم بياني) — توزيع القيم عبر فترات زمنية محددة مسبقًا (مثل وقت تنفيذ الطلب). \n
بالإضافة إلى ذلك، يتم دعم Summary (الكميات) و Family (مجموعات المقاييس من نفس النوع بعلامات مختلفة).
\n\nالتثبيت والربط
\n\nيتم توزيع المكتبة عبر مديري الحزم (vcpkg, Conan) أو يتم بناؤها من المصدر. مثال على التثبيت عبر vcpkg:
\n\nvcpkg install prometheus-cpp\n\nبعد التثبيت، في ملف CMakeLists.txt، يجب ربط المكتبة:
\n\nfind_package(prometheus-cpp CONFIG REQUIRED)\ntarget_link_libraries(your_target PRIVATE prometheus-cpp::push prometheus-cpp::pull prometheus-cpp::core)\n\nهنا، يُستخدم push لإرسال المقاييس إلى Pushgateway، و pull لإنشاء خادم HTTP الذي سيسحب منه Prometheus المقاييس، بينما يحتوي core على الفئات الأساسية (Registry, Counter, Gauge, Histogram).
مثال على الاستخدام: خادم HTTP لجمع المقاييس
\n\nلننظر في مثال بسيط ينشئ خادم HTTP على المنفذ 8080، والذي يقدم المقاييس بتنسيق Prometheus. للعمل مع HTTP، يتم استخدام الآلية المدمجة في المكتبة بناءً على simple-web-server أو libmicrohttpd.
#include <prometheus/exposer.h>\n#include <prometheus/registry.h>\n#include <prometheus/counter.h>\n#include <prometheus/gauge.h>\n#include <prometheus/histogram.h>\n#include <thread>\n#include <chrono>\n\nint main() {\n // إنشاء خادم HTTP على المنفذ 8080\n prometheus::Exposer exposer{"0.0.0.0:8080"};\n\n // إنشاء سجل المقاييس\n auto registry = std::make_shared<prometheus::Registry>();\n\n // 1. Counter (عداد)\n auto& counter_family = prometheus::BuildCounter()\n .Name("http_requests_total")\n .Help("Total number of HTTP requests")\n .Register(*registry);\n\n auto& counter = counter_family.Add({{"method", "GET"}, {"endpoint", "/api"}});\n\n // 2. Gauge (مقياس)\n auto& gauge_family = prometheus::BuildGauge()\n .Name("memory_usage_bytes")\n .Help("Current memory usage in bytes")\n .Register(*registry);\n\n auto& gauge = gauge_family.Add({});\n\n // 3. Histogram (رسم بياني)\n auto& histogram_family = prometheus::BuildHistogram()\n .Name("request_duration_seconds")\n .Help("Request duration in seconds")\n .Buckets({0.1, 0.5, 1.0, 2.5, 5.0})\n .Register(*registry);\n\n auto& histogram = histogram_family.Add({{"handler", "p