परिचय: प्रोडक्शन Rust एप्लिकेशन के लिए मॉनिटरिंग क्यों ज़रूरी है?
\n\nRust एक सिस्टम प्रोग्रामिंग भाषा है जो अपनी परफॉरमेंस और सुरक्षा के लिए जानी जाती है। लेकिन उच्च लोड पर चलने वाला सबसे भरोसेमंद Rust एप्लिकेशन भी मेमोरी लीक, परफॉरमेंस गिरावट या अचानक पैनिक का सामना कर सकता है। गुणवत्तापूर्ण मॉनिटरिंग के बिना, आप समस्याओं को तब तक नहीं पकड़ पाएंगे जब तक वे उपयोगकर्ताओं को प्रभावित न करें।
\n\nइस गाइड में, हम Rust एप्लिकेशन मॉनिटरिंग की एडवांस्ड तकनीकों को कवर करेंगे: कस्टम मेट्रिक्स कलेक्शन से लेकर रियल-टाइम अलर्ट सेटअप तक। आप सीखेंगे कि कैसे Prometheus, Grafana और OpenTelemetry को अपने Rust इकोसिस्टम में इंटीग्रेट करें, और ऐसे प्रभावी अलर्ट कैसे लिखें जो बेवजह "शोर" न मचाएं।
\n\n1. Prometheus और कस्टम मेट्रिक्स के साथ एडवांस्ड इंस्ट्रूमेंटेशन
\n\nPrometheus का बेसिक इंटीग्रेशन Rust में आमतौर पर prometheus क्रेट का उपयोग करके किया जाता है। लेकिन प्रोडक्शन सिस्टम के लिए अधिक बारीक ट्यूनिंग की आवश्यकता होती है। आइए देखें कि हिस्टोग्राम और समरी के साथ कस्टम मेट्रिक्स कैसे जोड़ें, और उनके रजिस्ट्रेशन को सही तरीके से कैसे मैनेज करें।
1.1. कस्टम मेट्रिक रजिस्ट्री बनाना
\n\nग्लोबल रजिस्ट्री से बचें — इससे टेस्टिंग मुश्किल हो जाती है और नामों में टकराव हो सकता है। अपनी खुद की Registry का उपयोग करें:
use prometheus::{Registry, CounterVec, HistogramVec, Opts};\nuse std::sync::Arc;\n\n#[derive(Clone)]\npub struct AppMetrics {\n pub request_counter: CounterVec,\n pub request_duration: HistogramVec,\n registry: Registry,\n}\n\nimpl AppMetrics {\n pub fn new() -> Result<Self, Box<dyn std::error::Error>> {\n let registry = Registry::new();\n\n let request_counter = CounterVec::new(\n Opts::new("app_requests_total", "Total number of requests")\n .namespace("myapp"),\n &["method", "endpoint", "status"]\n )?;\n\n let request_duration = HistogramVec::new(\n Opts::new("app_request_duration_seconds", "Request duration in seconds")\n .namespace("myapp"),\n &["method", "endpoint"]\n )?;\n\n registry.register(Box::new(request_counter.clone()))?;\n registry.register(Box::new(request_duration.clone()))?;\n\n Ok(Self { request_counter, request_duration, registry })\n }\n\n pub fn gather(&self) -> prometheus::Result<Vec<prometheus::proto::MetricFamily>> {\n self.registry.gather()\n }\n}\n\n1.2. सटीक परसेंटाइल के लिए हिस्टोग्राम का उपयोग
\n\nहिस्टोग्राम आपको रिस्पॉन्स टाइम के वितरण को ट्रैक करने में मदद करते हैं। अपने लोड के अनुसार बकेट सेट करें:
\n\nuse prometheus::HistogramOpts;\n\nlet buckets = vec![0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0];\n\nlet request_duration = HistogramVec::new(\n HistogramOpts::new(\n "app_request_duration_seconds",\n "Request duration in seconds"\n )\n .buckets(buckets),\n &["method", "endpoint"]\n)?;\n\nGrafana में, आप histogram_quantile फ़ंक्शन का उपयोग करके सटीक p50, p95 और p99 प्राप्त कर सकते हैं।
2. अलर्ट सेटअप: अराजकता से शांति तक
\n\nखराब अलर्ट, अलर्ट न होने से भी बदतर होते हैं। वे "शोर" पैदा करते हैं और टीम को वास्तव में महत्वपूर्ण सिग्नल को नज़रअंदाज करने पर मजबूर करते हैं। आइए Rust एप्लिकेशन के लिए एक एडवांस्ड अलर्ट रणनीति देखें।
\n\n2.1. "गोल्डन सिग्नल" का नियम
\n\nप्रत्येक Rust माइक्रोसर्विस के लिए, आपको चार प्रमुख सिग्नल की मॉनिटरिंग करनी चाहिए:
\n- \n
- Latency (लेटेंसी) — अनुरोध प्रसंस्करण समय \n
- Traffic (ट्रैफ़िक) — प्रति सेकंड अनुरोधों की संख्या \n
- Errors (एरर) — असफल अनुरोधों का प्रतिशत \n
- Saturation (सैचुरेशन) — CPU, मेमोरी लोड, सक्रिय कनेक्शन की संख्या