Prometheus मेट्रिक्स Rust में: प्रदर्शन मॉनिटरिंग
Prometheus आधुनिक माइक्रोसर्विस आर्किटेक्चर में मेट्रिक्स संग्रह और विश्लेषण के लिए डी-फैक्टो मानक है। Rust इकोसिस्टम में कई परिपक्व लाइब्रेरीज़ हैं जो Prometheus प्रारूप में मेट्रिक्स निर्यात को आसानी से एकीकृत करने की अनुमति देती हैं। इस लेख में हम दो मुख्य लाइब्रेरीज़ पर विचार करेंगे: prometheus (आधिकारिक क्लाइंट) और metrics-exporter-prometheus (फ्रेमवर्क metrics का हिस्सा)।
Rust में मेट्रिक्स की आवश्यकता क्यों?
Rust एप्लिकेशन की मॉनिटरिंग इसके लिए महत्वपूर्ण है:
- प्रदर्शन ट्रैकिंग (लेटेंसी, थ्रूपुट)
- मेमोरी लीक और संसाधन समस्याओं का पता लगाना
- थ्रेशोल्ड मानों के आधार पर अलर्ट सेट करना
- ट्रेंड विश्लेषण और क्षमता योजना
prometheus लाइब्रेरी (prometheus-rs)
Prometheus के लिए आधिकारिक Rust क्लाइंट। मेट्रिक्स बनाने और निर्यात करने के लिए पूर्ण टूलसेट प्रदान करता है।
इंस्टॉलेशन
Cargo.toml में जोड़ें:
[dependencies]prometheus = { version = "0.13", features = ["process"] }hyper = { version = "0.14", features = ["http1", "server"] }बेसिक उदाहरण: मेट्रिक्स के साथ HTTP सर्वर
use prometheus::{Counter, HistogramOpts, HistogramVec, IntCounter, Registry, TextEncoder};use std::net::SocketAddr;use hyper::{Body, Request, Response, Server};use hyper::service::{make_service_fn, service_fn};use std::convert::Infallible;use std::sync::Arc;use tokio::sync::Mutex;
#[tokio::main]async fn main() { let registry = Registry::new();
// अनुरोध काउंटर बनाएँ let request_counter = IntCounter::new("http_requests_total", "Total HTTP requests") .unwrap(); registry.register(Box::new(request_counter.clone())).unwrap();
// प्रतिक्रिया समय के लिए हिस्टोग्राम let request_duration = HistogramVec::new( HistogramOpts::new("http_request_duration_seconds", "HTTP request duration"), &["method", "path"] ).unwrap(); registry.register(Box::new(request_duration.clone())).unwrap();
let data = Arc::new(Mutex::new((request_counter, request_duration)));
let make_svc = make_service_fn(move |_conn| { let data = data.clone(); async move { Ok::<_, Infallible>(service_fn(move |req: Request| { let data = data.clone(); async move { let start = std::time::Instant::now(); let (counter, duration) = &*data.lock().await; counter.inc();
// अनुरोध प्रसंस्करण let response = match req.uri().path() { "/metrics" => { let encoder = TextEncoder::new(); let metric_families = registry.gather(); let mut buffer = vec![]; encoder.encode(&metric_families, &mut buffer).unwrap(); Response::new(Body::from(buffer)) } "/" => Response::new(Body::from("Hello, World!")), _ => Response::builder() .status(404) .body(Body::from("Not Found")) .unwrap(), };
let elapsed = start.elapsed().as_secs_f64(); duration .with_label_values(&[req.method().as_str(), req.uri().path()]) .observe(elapsed);
Ok::<_, Infallible>(response) } })) } });
let addr = SocketAddr::from(([127, 0, 0, 1], 8080)); let server = Server::bind(&addr).serve(make_svc); println!("Listening on http://{}", addr); if let Err(e) = server.a