use std::collections::BTreeMap;
use crate::{routing::RouterError, usage::ProviderMetrics};
#[async_trait::async_trait]
pub trait MetricsRepository {
async fn get_metrics(&self) -> Result<BTreeMap<String, ProviderMetrics>, RouterError>;
async fn get_provider_metrics(
&self,
provider: &str,
) -> Result<Option<ProviderMetrics>, RouterError>;
async fn get_model_metrics(
&self,
provider: &str,
model: &str,
) -> Result<Option<crate::usage::ModelMetrics>, RouterError>;
}
pub struct InMemoryMetricsRepository {
metrics: BTreeMap<String, ProviderMetrics>,
}
impl InMemoryMetricsRepository {
pub fn new(metrics: BTreeMap<String, ProviderMetrics>) -> Self {
Self { metrics }
}
}
#[async_trait::async_trait]
impl MetricsRepository for InMemoryMetricsRepository {
async fn get_metrics(&self) -> Result<BTreeMap<String, ProviderMetrics>, RouterError> {
Ok(self.metrics.clone())
}
async fn get_provider_metrics(
&self,
provider: &str,
) -> Result<Option<ProviderMetrics>, RouterError> {
Ok(self.metrics.get(provider).cloned())
}
async fn get_model_metrics(
&self,
provider: &str,
model: &str,
) -> Result<Option<crate::usage::ModelMetrics>, RouterError> {
Ok(self
.metrics
.get(provider)
.and_then(|provider_metrics| provider_metrics.models.get(model))
.cloned())
}
}