use actix_web::{get, middleware, web::Data, App, HttpRequest, HttpResponse, HttpServer, Responder};
pub use controller::{self, telemetry, State};
use prometheus::{Encoder, TextEncoder};
#[get("/metrics")]
async fn metrics(c: Data<State>, _req: HttpRequest) -> impl Responder {
let metrics = c.metrics();
let encoder = TextEncoder::new();
let mut buffer = vec![];
encoder.encode(&metrics, &mut buffer).unwrap();
HttpResponse::Ok().body(buffer)
}
#[get("/health")]
async fn health(_: HttpRequest) -> impl Responder {
HttpResponse::Ok().json("healthy")
}
#[get("/")]
async fn index(c: Data<State>, _req: HttpRequest) -> impl Responder {
let d = c.diagnostics().await;
HttpResponse::Ok().json(&d)
}
async fn app_main() -> anyhow::Result<()> {
telemetry::init().await;
let state = State::default();
let controller = controller::run(state.clone());
let server = HttpServer::new(move || {
App::new()
.app_data(Data::new(state.clone()))
.wrap(middleware::Logger::default().exclude("/health"))
.service(index)
.service(health)
.service(metrics)
})
.bind("0.0.0.0:8080")?
.shutdown_timeout(5);
tokio::join!(controller, server.run()).1?;
Ok(())
}
fn main() -> anyhow::Result<()> {
let rt = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.thread_stack_size(4 * 1024 * 1024)
.build()?;
rt.block_on(app_main())
}