C++ में ऑब्ज़र्वेबिलिटी: पेशेवरों के लिए ट्रेसिंग, मीट्रिक्स और लॉग

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

अपने C++ कोड के अंदर झाँकें: क्यों ऑब्ज़र्वेबिलिटी एक विलासिता नहीं, बल्कि एक आवश्यकता है

\n\n

कल्पना करें: आपने C++ में एक उच्च-लोड वाली सेवा शुरू की। एक घंटा, दो घंटे, एक दिन बीत गया — सब कुछ ठीक चल रहा है। फिर अचानक! — उपयोगकर्ता धीमेपन की शिकायत करते हैं, और आप बैठकर सोचते हैं: बाधा कहाँ है? मेमोरी में? नेटवर्क में? या किसी ने संसाधन को मुक्त करना भूल दिया? ऑब्ज़र्वेबिलिटी सिस्टम के बिना, आप एक ऐसे जहाज के कप्तान की तरह हैं जिसके पोरथोल बंद हैं। आपको लगता है कि कुछ गलत हो रहा है, लेकिन आप देख नहीं सकते कि वास्तव में क्या।

\n\n

C++ में ऑब्ज़र्वेबिलिटी (अवलोकनीयता) आपके पेरिस्कोप और रडार का सेट है। यह केवल लॉगिंग नहीं है, बल्कि तीन स्तंभ हैं: ट्रेसिंग, मीट्रिक्स और लॉग। इस लेख में, हम वास्तविक कोड उदाहरणों के साथ उनमें से प्रत्येक का विश्लेषण करेंगे, दिखाएंगे कि C++ को OpenTelemetry और Prometheus के साथ कैसे जोड़ा जाए, और प्रोडक्शन के लिए तैयार रेसिपी देंगे। चलिए शुरू करते हैं!

\n\n

ऑब्ज़र्वेबिलिटी के तीन स्तंभ: ट्रेसिंग, मीट्रिक्स, लॉग

\n\n

कोड में गोता लगाने से पहले, आइए स्पष्ट रूप से परिभाषित करें कि ये अवधारणाएँ कैसे भिन्न हैं और एक-दूसरे की पूरक कैसे हैं। कई लोग ऑब्ज़र्वेबिलिटी को साधारण लॉगिंग समझ लेते हैं — और यह गलत है। यह एक टॉर्च की तुलना सर्चलाइट से करने जैसा है।

\n\n
    \n
  • लॉग — घटनाएँ हैं। "क्या हुआ?" (उदाहरण के लिए, "उपयोगकर्ता ने लॉगिन किया" या "DB से कनेक्शन में त्रुटि")। वे विस्तृत हैं, लेकिन संदर्भ के बिना बेकार हो सकते हैं।
  • \n
  • मीट्रिक्स — संख्याएँ हैं। "कितना?" (प्रति सेकंड अनुरोधों की संख्या, CPU उपयोग, प्रतिक्रिया समय)। वे एकत्रित होते हैं और रुझान दिखाते हैं।
  • \n
  • ट्रेसिंग — अनुरोध का पथ है। "यह वास्तव में कैसे हुआ?" (सेवा में प्रवेश से लेकर डेटाबेस कॉल और क्लाइंट को प्रतिक्रिया तक)। यह लॉग और मीट्रिक्स के बीच की कड़ी है।
  • \n
\n\n

C++ में आदर्श ऑब्ज़र्वेबिलिटी तब है जब आप डैशबोर्ड को देखकर 10 सेकंड में समझ सकते हैं: कहाँ, कब और क्यों एक विसंगति हुई। इसके बिना, आप प्रोडक्शन के साथ अनुमान लगाने का खेल खेलेंगे।

\n\n

C++ में ट्रेसिंग: OpenTelemetry को कैसे लागू करें

\n\n

आइए सबसे शक्तिशाली, लेकिन सबसे जटिल उपकरण — ट्रेसिंग से शुरू करें। OpenTelemetry टेलीमेट्री संग्रह के लिए डी-फैक्टो मानक है। C++ में, यह Go या Java जितना समृद्ध रूप से समर्थित नहीं है, लेकिन स्थिर रूप से काम करता है।

\n\n

मान लीजिए, हमारे पास C++ में एक सरल HTTP सर्वर है (हम एक विचार का उपयोग करते हैं, कोई विशिष्ट लाइब्रेरी नहीं)। हमें यह ट्रैक करने की आवश्यकता है कि प्रत्येक अनुरोध को संसाधित होने में कितना समय लगता है और इसके अंदर कौन से कॉल होते हैं।

\n\n

C++ में OpenTelemetry सेटअप करना

\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                

ब्लॉग

पुस्तक अनुशंसाएँ