use crate::BackgroundService;
use crate::error::RunnerError as Error;
use blueprint_core::{error, info};
use blueprint_qos::servers::ServerManager;
use blueprint_qos::servers::prometheus::PrometheusServer;
use std::future::Future;
use std::sync::Arc;
use tokio::sync::oneshot;
pub struct MetricsServerAdapter {
server: Arc<PrometheusServer>,
}
impl MetricsServerAdapter {
#[must_use]
pub fn new(server: Arc<PrometheusServer>) -> Self {
Self { server }
}
}
impl BackgroundService for MetricsServerAdapter {
fn start(
&self,
) -> impl Future<Output = Result<oneshot::Receiver<Result<(), Error>>, Error>> + Send {
let server = self.server.clone();
async move {
let (tx, rx) = oneshot::channel();
tokio::spawn(async move {
info!("Starting metrics server...");
if let Err(e) = server.start(None, None).await {
error!("Failed to start metrics server: {}", e);
let _ = tx.send(Err(Error::Other(
format!("Failed to start metrics server: {}", e).into(),
)));
return;
}
info!("Metrics server started successfully at {}", server.url());
if let Err(e) = server.wait_until_ready(30).await {
error!("Metrics server failed to become ready: {}", e);
let _ = tx.send(Err(Error::Other(
format!("Metrics server failed to become ready: {}", e).into(),
)));
return;
}
info!("Metrics server is ready");
let _ = tx.send(Ok(()));
});
Ok(rx)
}
}
}