C++ अनुप्रयोगों की निगरानी: मेट्रिक्स संग्रह और लॉगिंग के लिए उपकरण और पुस्तकालय
\n\nC++ में विकास अक्सर उच्च-लोड सिस्टम बनाने से जुड़ा होता है, जहाँ प्रदर्शन और स्थिरता महत्वपूर्ण होती है। गुणवत्तापूर्ण निगरानी के बिना, बाधाओं, मेमोरी लीक या असामान्य व्यवहार की तुरंत पहचान करना असंभव है। इस लेख में, हम C++ अनुप्रयोगों की निगरानी के आयोजन के लिए मुख्य पुस्तकालयों और दृष्टिकोणों पर विचार करेंगे - मेट्रिक्स संग्रह से लेकर लोकप्रिय observability सिस्टम के साथ एकीकरण तक।
\n\nC++ अनुप्रयोगों की निगरानी क्यों आवश्यक है?
\nनिगरानी के प्रमुख कार्य:
\n- \n
- CPU, मेमोरी, डिस्क और नेटवर्क के उपयोग पर नज़र रखना। \n
- अनुरोध प्रसंस्करण की विलंबता (latency) को मापना। \n
- त्रुटियों और अपवादों की संख्या एकत्र करना। \n
- कोड में हॉट पाथ (hot paths) की प्रोफाइलिंग करना। \n
- सीमा मानों तक पहुँचने पर स्वचालित अलर्टिंग। \n
C++ निगरानी के लिए मुख्य पुस्तकालय
\n\n1. Prometheus-CPP (prometheus-cpp)
\nPrometheus प्रारूप में मेट्रिक्स एकत्र करने और निर्यात करने के लिए सबसे लोकप्रिय पुस्तकालयों में से एक। यह काउंटर (counter), हिस्टोग्राम (histogram) और गेज (gauge) बनाने की अनुमति देता है।
\nउपयोग का उदाहरण:
\n#include <prometheus/counter.h>\n#include <prometheus/exposer.h>\n#include <prometheus/registry.h>\n\n// मेट्रिक्स संग्रह के लिए HTTP एंडपॉइंट\nprometheus::Exposer exposer{"0.0.0.0:8080"};\nauto registry = std::make_shared<prometheus::Registry>();\n\n// काउंटर बनाएं\nauto& counter_family = prometheus::BuildCounter()\n .Name("http_requests_total")\n .Help("Total HTTP requests")\n .Register(*registry);\n\nauto& http_requests = counter_family.Add({{"method", "GET"}});\n\n// मेट्रिक्स प्रदर्शित करें\nexposer.RegisterCollectable(registry);\n\n// प्रत्येक अनुरोध पर काउंटर बढ़ाएँ\nhttp_requests.Increment();\n\n2. OpenTelemetry C++
\nट्रेस (traces), मेट्रिक्स और लॉग एकत्र करने के लिए आधुनिक मानक। C++ के लिए OpenTelemetry कोड को इंस्ट्रूमेंट करने और किसी भी बैकएंड (Jaeger, Zipkin, Prometheus) में डेटा निर्यात करने के लिए SDK प्रदान करता है।
\nट्रेसिंग सेटअप का उदाहरण:
\n#include <opentelemetry/trace/provider.h>\n#include <opentelemetry/exporters/otlp/otlp_http_exporter.h>\n#include <opentelemetry/sdk/trace/tracer_provider.h>\n\n// एक्सपोर्टर को इनिशियलाइज़ करें\nauto exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(\n new opentelemetry::exporter::otlp::OtlpHttpExporter());\n\nauto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(\n new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter)));\n\nauto provider = std::shared_ptr<opentelemetry::trace::TracerProvider>(\n new opentelemetry::sdk::trace::TracerProvider(std::move(processor)));\n\nopentelemetry::trace::Provider::SetTracerProvider(provider);\n\n// स्पैन बनाएँ\nauto tracer = provider->GetTracer("my_app");\nauto span = tracer->StartSpan("process_request");\nspan->SetAttribute("user_id", 12345);\nspan->End();\n\n3. spdlog + मेट्रिक्स
\nहालाँकि spdlog एक लॉगिंग लाइब्रेरी है, इसे अक्सर कस्टम मेट्रिक्स के साथ जोड़ा जाता है। उदाहरण के लिए, कोई फ़ंक्शन निष्पादन समय को लॉग कर सकता है और तृतीय-पक्ष टूल (Filebeat + Elasticsearch) के साथ लॉग को पार्स कर सकता है।
\nspdlog के साथ समय मापने का उदाहरण:
\n#include <spdlog/spdlog.h>\n#include <chrono>\n\nvoid process_data() {\n auto start = std::chrono::high_resolution_clock::now();\n // ... व्यावसायिक तर्क ...\n auto end = std::chrono::high_resolution_clock::now();\n auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);\n spdlog::info("process_data took {} ms", duration.count());\n}\n\n4. Google Performance Tools (gperftools)
\nप्रोफाइलिंग के लिए उपकरणों का सेट: CPU profiler, heap profiler और hea