extern crate serde_derive; extern crate toml; extern crate hyper; extern crate lazy_static; extern crate prometheus; extern crate futures; extern crate tokio; extern crate env_logger; use hyper::header::CONTENT_TYPE; use hyper::{Body, Request, Response, Server}; use hyper::rt::Future; use hyper::service::service_fn_ok; use lazy_static::lazy_static; use prometheus::{Counter, Encoder, Gauge, HistogramVec, TextEncoder}; use prometheus::*; use futures::future::lazy; //TODO: Replace with useful metrics, these are beyond useless lazy_static! { static ref HTTP_COUNTER: Counter = register_counter!(opts!( "example_http_requests_total", "Total number of HTTP requests made.", labels! {"handler" => "all",} )) .unwrap(); static ref HTTP_BODY_GAUGE: Gauge = register_gauge!(opts!( "example_http_response_size_bytes", "The HTTP response sizes in bytes.", labels! {"handler" => "all",} )) .unwrap(); static ref HTTP_REQ_HISTOGRAM: HistogramVec = register_histogram_vec!( "example_http_request_duration_seconds", "The HTTP request latencies in seconds.", &["handler"] ) .unwrap(); } fn start_serving_metrics() { let serve_metrics = || { service_fn_ok(|_req| { HTTP_COUNTER.inc(); let timer = HTTP_REQ_HISTOGRAM.with_label_values(&["all"]).start_timer(); let metric_families = prometheus::gather(); let mut buffer = vec![]; let encoder = TextEncoder::new(); encoder.encode(&metric_families, &mut buffer).unwrap(); HTTP_BODY_GAUGE.set(buffer.len() as f64); let mut res = Response::new(Body::from(buffer)); res.headers_mut().insert(CONTENT_TYPE, encoder.format_type().parse().unwrap()); timer.observe_duration(); res }) }; println!("listening addr 127.0.0.1:9898"); let server = Server::bind(&([127, 0, 0, 1], 9898).into()) .serve(serve_metrics) .map_err(|err| eprintln!("server error: {}", err)); tokio::spawn(server); } fn start_pinging_hosts() { tokio::spawn(lazy(|| { //TODO: Implement the pinging, based on oping and the example over at // https://tokio.rs/docs/futures/spawning/ Ok(()) })); } //TODO: Clean this shameful mess up! //TODO: Do config reading, cli args, logging etc fn main() { env_logger::init(); tokio::run(lazy(|| { start_serving_metrics(); start_pinging_hosts(); Ok(()) })); }