diff options
| author | Matthieu <matthieu@developershouse.xyz> | 2021-09-09 22:16:39 +0400 |
|---|---|---|
| committer | Matthieu <matthieu@developershouse.xyz> | 2021-09-09 22:16:39 +0400 |
| commit | 11912b050a97c258a8a38552d855f183c339beee (patch) | |
| tree | d80f960beb4e0455cd8d0d8addb7b3308dda6933 /common/rust/src/monitoring.rs | |
| parent | e28d134370196d3e4d3ff9016a36cce011031e58 (diff) | |
gateway improvements, common packages and examples
Diffstat (limited to 'common/rust/src/monitoring.rs')
| -rw-r--r-- | common/rust/src/monitoring.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/common/rust/src/monitoring.rs b/common/rust/src/monitoring.rs new file mode 100644 index 0000000..ded1d95 --- /dev/null +++ b/common/rust/src/monitoring.rs @@ -0,0 +1,60 @@ +use hyper::{ + Response, Body, Request, Server, + header::{CONTENT_TYPE}, + service::{make_service_fn, service_fn}, +}; +use std::net::ToSocketAddrs; +use prometheus::{Encoder, TextEncoder}; +use log::{info,error}; +use serde::Deserialize; + +#[derive(Clone, Debug, Deserialize)] +/// Options for the monitoring service +pub struct MonitoringConfiguration { + enabled: bool, + address: Option<String>, + port: Option<i32>, +} + +/// Handler for the hyper http server +async fn serve_metrics(_request: Request<Body>) -> Result<Response<Body>, hyper::Error> { + let encoder = TextEncoder::new(); + let metrics = prometheus::gather(); + + let mut buffer = vec![]; + encoder.encode(&metrics, &mut buffer).unwrap(); + + let response = Response::builder() + .status(200) + .header(CONTENT_TYPE, encoder.format_type()) + .body(Body::from(buffer)) + .unwrap(); + Ok(response) +} + +/// Starts a monitoring server on the requested port +pub fn start_monitoring(configuration: &MonitoringConfiguration) { + let config = configuration.clone(); + tokio::task::spawn(async move { + if config.enabled { + let address = format!("{}:{}", + config.address.expect("a listening address must be specified for the metrics server"), + config.port.expect("a listening port must be specified for the metrics server") + ); + info!("Starting monitoring server on {}", address); + + let listen_address = address + .to_socket_addrs() + .unwrap() + .next() + .unwrap(); + let server = Server::bind(&listen_address).serve(make_service_fn(|_| async { + Ok::<_, hyper::Error>(service_fn(serve_metrics)) + })); + + if let Err(e) = server.await { + error!("failed to start the monitoring server {}", e); + } + } + }); +}
\ No newline at end of file |
