sui_security_watchdog/
metrics.rsuse prometheus::{register_int_gauge_with_registry, IntGauge, Registry};
use std::collections::HashMap;
use tokio::sync::Mutex;
#[derive(Debug)]
pub struct WatchdogMetrics {
registry: Registry,
metrics: Mutex<HashMap<String, IntGauge>>,
}
impl WatchdogMetrics {
pub fn new(registry: &Registry) -> Self {
Self {
registry: registry.clone(),
metrics: Mutex::new(HashMap::new()),
}
}
pub async fn get(&self, metric_name: &str) -> anyhow::Result<IntGauge> {
let mut metrics = self.metrics.lock().await;
let metric = metrics.entry(metric_name.to_string()).or_insert_with(|| {
register_int_gauge_with_registry!(metric_name, metric_name, &self.registry).unwrap()
});
Ok(metric.clone())
}
pub async fn get_exact(&self, metric_name: &str) -> anyhow::Result<IntGauge> {
let mut metrics = self.metrics.lock().await;
let metric_name = format!("{}_exact", metric_name);
let metric = metrics.entry(metric_name.clone()).or_insert_with(|| {
register_int_gauge_with_registry!(&metric_name, &metric_name, &self.registry).unwrap()
});
Ok(metric.clone())
}
pub async fn get_lower(&self, metric_name: &str) -> anyhow::Result<IntGauge> {
let mut metrics = self.metrics.lock().await;
let metric_name = format!("{}_lower", metric_name);
let metric = metrics.entry(metric_name.clone()).or_insert_with(|| {
register_int_gauge_with_registry!(&metric_name, &metric_name, &self.registry).unwrap()
});
Ok(metric.clone())
}
pub async fn get_upper(&self, metric_name: &str) -> anyhow::Result<IntGauge> {
let mut metrics = self.metrics.lock().await;
let metric_name = format!("{}_upper", metric_name);
let metric = metrics.entry(metric_name.clone()).or_insert_with(|| {
register_int_gauge_with_registry!(&metric_name, &metric_name, &self.registry).unwrap()
});
Ok(metric.clone())
}
}