مراقبة تطبيقات C++: مكتبة metrics لجمع المقاييس

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

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

ابدأ الدورة

مراقبة تطبيقات C++ باستخدام مكتبة metrics



عند تطوير أنظمة عالية التحميل وحرجة على C++، لا يمكن الاستغناء عن مراقبة عالية الجودة. تتبع الأداء، اكتشاف الاختناقات، والاستجابة السريعة للأعطال هي مهام أساسية لـ DevOps والمطورين. توفر مكتبة metrics (المعروفة أيضًا باسم cppmetrics) طريقة خفيفة وفعالة لجمع وتجميع وتصدير المقاييس مباشرة من كود C++.



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



ما هي مكتبة metrics؟



metrics هي مكتبة header-only للغة C++ (C++11 وما فوق)، تنفذ أنواع المقاييس الشائعة من Dropwizard Metrics (Java). تتضمن:



  • العدادات (Counters) — لحساب الأحداث (مثل عدد الطلبات).
  • المقاييس اللحظية (Gauges) — للقيم الفورية (تحميل وحدة المعالجة المركزية الحالي، حجم قائمة الانتظار).
  • المدرجات التكرارية (Histograms) — لتحليل توزيع القيم (وقت الاستجابة، حجم الحزمة).
  • المؤقتات (Timers) — مزيج من العداد والمدرج التكراري لقياس مدة العمليات.
  • مقاييس السرعة (Meters) — تقيس معدل الأحداث (الطلبات في الثانية).


تدعم المكتبة أمان الخيوط (thread safety)، وخزانات قابلة للتخصيص لأخذ العينات (مثل الخزانات الأسية المتناقصة)، وتصدير المقاييس بتنسيقات JSON وPrometheus وGraphite.



التثبيت والتضمين



نظرًا لأن المكتبة هي header-only، فإن التثبيت يقتصر على نسخ ملفات الرأس إلى مشروعك. يمكنك استخدام CMake FetchContent أو ببساطة نسخ مجلد metrics إلى مجلد include:



#include <metrics/metrics.hpp>


للعمل مع Prometheus، ستحتاج أيضًا إلى تثبيت prometheus-cpp (اختياري).



مثال على الاستخدام: المقاييس الأساسية



لنفكر في خادم HTTP بسيط يحسب عدد الطلبات ويقيس وقت معالجتها.



#include <metrics/metrics.hpp>#include <iostream>#include <thread>#include <chrono>

using namespace metrics;

// إنشاء سجل المقاييسMetricsRegistry registry("my_app");

// تعريف عداد ومؤقتCounter& request_counter = registry.counter("http.requests.total");Timer& request_timer = registry.timer("http.requests.duration");

void handle_request() { auto context = request_timer.create_context(); // بدء المؤقت request_counter.increment(); // زيادة العداد

// محاكاة المعالجة std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));

// يتم تسجيل الوقت تلقائيًا عند تدمير context}

int main() { for (int i = 0; i < 100; ++i) { handle_request(); }

// عرض المقاييس في وحدة التحكم (JSON) std::cout << registry.report_json() << std::endl; return 0;}


ستحصل على JSON يحتوي على العداد، والنسب المئوية 50 و75 و95 و99 لوقت المعالجة.



تصدير المقاييس إلى Prometheus



للتكامل مع Prometheus، توفر المكتبة وحدة منفصلة metrics_prometheus. مثال على إعداد نقطة النهاية:



#include <metrics/metrics.hpp>#include <metrics/prometheus/prometheus_collector.hpp>#include <metrics/prometheus/prometheus_server.hpp>

using namespace metrics;

int main() { MetricsRegistry registry("my_service"); // ... تسجيل المقاييس ...

// إنشاء خادم HTTP على المنفذ 8080 PrometheusServer server(registry, 8080); server.start();

std::cout << "Prometheus metrics available a

توصيات