المراقبة في C++: التتبع، المقاييس والسجلات للمحترفين

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

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

ابدأ الدورة

انظر داخل كود C++ الخاص بك: لماذا المراقبة ليست رفاهية بل ضرورة

\n\n

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

\n\n

المراقبة (Observability) في C++ هي مجموعة المناظير والرادارات الخاصة بك. إنها ليست مجرد تسجيل، بل ثلاثة أركان: التتبع، المقاييس، والسجلات. في هذه المقالة، سنشرح كل منها بأمثلة كود حقيقية، ونوضح كيفية دمج C++ مع OpenTelemetry وPrometheus، ونقدم وصفات جاهزة للإنتاج. هيا بنا!

\n\n

الأركان الثلاثة للمراقبة: التتبع، المقاييس، السجلات

\n\n

قبل الغوص في الكود، دعنا نحدد بوضوح كيف تختلف هذه المفاهيم وكيف يكمل بعضها البعض. كثيرون يخلطون بين المراقبة والتسجيل البسيط - وهذا خطأ. إنها مثل مقارنة مصباح يدوي بمنصة أضواء كاشفة.

\n\n
    \n
  • السجلات - هي الأحداث. "ماذا حدث؟" (على سبيل المثال، "تم تسجيل دخول المستخدم" أو "خطأ في الاتصال بقاعدة البيانات"). إنها مفصلة، لكن بدون سياق قد تكون عديمة الفائدة.
  • \n
  • المقاييس - هي الأرقام. "كم؟" (عدد الطلبات في الثانية، استخدام وحدة المعالجة المركزية، وقت الاستجابة). إنها مجمعة وتظهر الاتجاهات.
  • \n
  • التتبع - هو مسار الطلب. "كيف حدث هذا بالضبط؟" (من دخول الخدمة إلى استدعاء قاعدة البيانات والرد على العميل). إنها حلقة الوصل بين السجلات والمقاييس.
  • \n
\n\n

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

\n\n

التتبع في C++: كيفية دمج OpenTelemetry

\n\n

لنبدأ بأقوى أداة ولكنها الأكثر تعقيدًا - التتبع. OpenTelemetry هو المعيار الفعلي لجمع بيانات القياس عن بُعد. في C++، الدعم ليس غنيًا كما في Go أو Java، لكنه يعمل بثبات.

\n\n

لنفترض أن لدينا خادم HTTP بسيط بلغة C++ (نستخدم الفكرة، وليس مكتبة محددة). نحتاج إلى تتبع المدة التي يستغرقها معالجة كل طلب وما هي الاستدعاءات الداخلية التي تحدث.

\n\n

إعداد OpenTelemetry في C++

\n\n

أولاً، نقوم بتثبيت التبعيات. في ملف CMakeLists.txt نضيف:

\n\n
find_package(opentelemetry-cpp REQUIRED)\ntarget_link_libraries(my_app PRIVATE opentelemetry::api opentelemetry::exporter_ostream)
\n\n

الآن سننشئ أداة التتبع والسبانات (span هي وحدة عمل). إليك مثال بسيط:

\n\n
#include <opentelemetry/trace/provider.h>\n#include <opentelemetry/exporters/ostream/span_exporter.h>\n#include <opentelemetry/sdk/trace/tracer_provider.h>\n#include <opentelemetry/sdk/trace/simple_processor.h>\n\nnamespace trace_api = opentelemetry::trace;\nnamespace trace_sdk = opentelemetry::sdk::trace;\nnamespace trace_exporter = opentelemetry::exporter::trace;\n\nvoid init_tracer() {\n    auto exporter = std::unique_ptr<trace_sdk::SpanExporter>(\n        new trace_exporter::OStreamSpanExporter(std::cout));\n    auto processor = std::unique_ptr<trace_sdk::SpanProcessor>(\n        new trace_sdk::SimpleSpanProcessor(std::move(exporter)));\n    auto provider = std::make_shared<trace_sdk::TracerProvider>(std::move(processor));\n    trace_api::Provider::SetTracerProvider(provider);\n}\n\nvoid process_request(const std::string& user_id) {\n    auto tracer = trace_api::Provider::GetTracerProvider()->GetTracer("my_service");\n    auto span = tracer->StartSpan("process_request");\n    span->SetAttribute("user.id", user_id);\n\n    // محاكاة العمل\n    std::this_thread::sleep_for(std::chrono::milliseconds(100));\n\n    span->End();\n}\n\nint main                

المدونات

توصيات الكتب