pub(crate) mod exporter;
use prometheus::{register, Encoder, TextEncoder};
use tide::{Body, Request, Response, Server};
use crate::exporter::Exporter;
use libp2prs_runtime::task;
use libp2prs_swarm::Control;
pub struct ExporterServer {
s: Server<()>,
}
impl ExporterServer {
pub fn new(control: Control) -> Self {
let mut s = tide::new();
let exporter = Exporter::new(control);
let _ = register(Box::new(exporter));
s.at("/metrics").get(get_metric);
ExporterServer { s }
}
pub fn start(self, addr: String) {
task::spawn(async move {
let r = self.s.listen(addr).await;
log::info!("Exporter server started result={:?}", r);
});
}
}
async fn get_metric(_: Request<()>) -> tide::Result {
let encoder = TextEncoder::new();
let metric_families = prometheus::gather();
let mut buffer = vec![];
encoder.encode(&metric_families, &mut buffer).unwrap();
let response = Response::builder(200)
.content_type("text/plain; version=0.0.4")
.body(Body::from(buffer))
.build();
Ok(response)
}