Rust अनुप्रयोगों की निगरानी: tracing लाइब्रेरी और मीट्रिक्स संग्रह
\n\nनिगरानी production-सिस्टम का एक महत्वपूर्ण तत्व है। अपने प्रदर्शन और विश्वसनीयता के लिए जाने जाने वाले Rust अनुप्रयोगों के लिए, टेलीमेट्री एकत्र करने के लिए एक हल्का और कुशल उपकरण होना महत्वपूर्ण है। tracing लाइब्रेरी Rust पारिस्थितिकी तंत्र में अवलोकनीयता के लिए डी-फैक्टो मानक बन गई है। यह संरचित लॉगिंग, अनुरोध ट्रेसिंग के लिए स्पैन और मीट्रिक्स संग्रह प्रणालियों के साथ एकीकरण प्रदान करती है।
tracing क्या है?
\n\ntracing Rust प्रोग्रामों के इंस्ट्रुमेंटेशन के लिए एक फ्रेमवर्क है। पारंपरिक लॉगिंग के विपरीत, यह इवेंट और स्पैन के आधार पर काम करता है। स्पैन कोड निष्पादन के अस्थायी खंडों का प्रतिनिधित्व करते हैं (जैसे, HTTP अनुरोध प्रसंस्करण), जबकि इवेंट स्पैन के अंदर बिंदु होते हैं (जैसे, "डेटाबेस ने 10 ms में उत्तर दिया")।
मुख्य क्षमताएँ:
\n- \n
- संरचित लॉगिंग — प्रत्येक इवेंट में केवल एक स्ट्रिंग के बजाय फ़ील्ड (कुंजी-मान) होते हैं। \n
- स्पैन का पदानुक्रम — स्पैन को एक दूसरे के अंदर नेस्ट किया जा सकता है, जिससे निष्पादन का पूरा पथ ट्रैक किया जा सकता है। \n
- अतुल्यकालिक समर्थन — tokio और async/await के साथ बढ़िया काम करता है। \n
- Subscriber (सब्सक्राइबर) — विभिन्न बैकएंड जोड़े जा सकते हैं: stdout, OpenTelemetry, Prometheus, फ़ाइलें। \n
स्थापना और बुनियादी उपयोग
\n\nCargo.toml में जोड़ें:
[dependencies]\ntracing = "0.1"\ntracing-subscriber = "0.3"\n\nसंरचित लॉगिंग का एक सरल उदाहरण:
\nuse tracing::{info, warn, error};\nuse tracing_subscriber;\n\nfn main() {\n // stdout पर आउटपुट के लिए subscriber आरंभ करें\n tracing_subscriber::fmt::init();\n\n let user_id = 42;\n let request_duration_ms = 150;\n\n info!(user_id, duration = request_duration_ms, "अनुरोध संसाधित");\n\n // warn स्तर के साथ लॉगिंग\n warn!(user_id, "प्रतिक्रिया समय सीमा से अधिक");\n\n // त्रुटि के साथ लॉगिंग\n error!("DB से कनेक्ट नहीं हो सका");\n}\n\nआउटपुट में JSON-जैसी स्ट्रिंग प्रारूप में फ़ील्ड होंगे, जो निगरानी प्रणालियों में पार्सिंग को सरल बनाता है।
\n\nस्पैन और ट्रेसिंग
\n\nस्पैन संचालन के निष्पादन समय को मापने और इवेंट को एक श्रृंखला में जोड़ने की अनुमति देते हैं:
\nuse tracing::{span, info, Level};\nuse tracing_subscriber;\n\nfn process_request(user_id: u32) {\n // संदर्भ के साथ एक span बनाएँ\n let span = span!(Level::INFO, "process_request", user_id);\n let _guard = span.enter(); // span को सक्रिय करें\n\n info!("प्रसंस्करण शुरू");\n std::thread::sleep(std::time::Duration::from_millis(50));\n info!("प्रसंस्करण पूर्ण");\n}\n\nfn main() {\n tracing_subscriber::fmt::init();\n process_request(100);\n}\n\nआउटपुट में एक नेस्टेड संदर्भ दिखाई देगा, जो दर्शाता है कि इवेंट process_request span से संबंधित हैं।
tracing और Prometheus के साथ मीट्रिक्स संग्रह
\n\nproduction-निगरानी के लिए अक्सर Prometheus में मीट्रिक्स निर्यात करने की आवश्यकता होती है। फ़ाइल में लिखने के लिए क्रेट tracing-appender या OpenTelemetry के साथ एकीकरण के लिए tracing-opentelemetry का उपयोग करें। हालाँकि, सबसे सीधा तरीका tracing के साथ metrics लाइब्रेरी का उपयोग करना है।
metrics-exporter-prometheus के साथ एकीकरण का उदाहरण:
[dependencies]\nmetrics = "0.21"\nmetrics-exporter-prometheus = "0.12"\ntracing = "0.1"\ntokio = { version = "1", features = ["full"] }\n\nमीट्रिक्स संग्रह के लिए कोड:
\nuse metrics::{counter, gauge, histogram};\nuse metrics_exporter_prometheus::PrometheusBuilder;\nuse std::net::SocketAddr;\n\n#[tokio::main]\nasync fn main() {\n // Prometheus के लिए HTTP सर्वर प्रारंभ करें\n let addr: SocketAddr = "0.0.0.0:9090".parse().unwrap();\n let builder = PrometheusBuilder::new();\n builder\n .wit