use async_trait::async_trait;
use http::Response;
use prometheus::{Encoder, TextEncoder};
use super::http_app::HttpServer;
use crate::apps::http_app::ServeHttp;
use crate::modules::http::compression::ResponseCompressionBuilder;
use crate::protocols::http::ServerSession;
pub struct PrometheusHttpApp;
#[async_trait]
impl ServeHttp for PrometheusHttpApp {
async fn response(&self, _http_session: &mut ServerSession) -> Response<Vec<u8>> {
let encoder = TextEncoder::new();
let metric_families = prometheus::gather();
let mut buffer = vec![];
encoder.encode(&metric_families, &mut buffer).unwrap();
Response::builder()
.status(200)
.header(http::header::CONTENT_TYPE, encoder.format_type())
.header(http::header::CONTENT_LENGTH, buffer.len())
.body(buffer)
.unwrap()
}
}
pub type PrometheusServer = HttpServer<PrometheusHttpApp>;
impl PrometheusServer {
pub fn new() -> Self {
let mut server = Self::new_app(PrometheusHttpApp);
server.add_module(ResponseCompressionBuilder::enable(7));
server
}
}