use prometheus::{CounterVec, Encoder, Opts, Registry, TextEncoder};
pub struct GatewayMetrics {
registry: Registry,
requests: CounterVec,
}
impl GatewayMetrics {
pub fn new() -> anyhow::Result<Self> {
let registry = Registry::new();
let requests = CounterVec::new(
Opts::new("arbit_requests_total", "Total requests processed by arbit"),
&["agent", "outcome"],
)?;
registry.register(Box::new(requests.clone()))?;
Ok(Self { registry, requests })
}
pub fn record(&self, agent: &str, outcome: &str) {
self.requests.with_label_values(&[agent, outcome]).inc();
}
pub fn render(&self) -> String {
let encoder = TextEncoder::new();
let families = self.registry.gather();
let mut buf = Vec::new();
let _ = encoder.encode(&families, &mut buf);
String::from_utf8(buf).unwrap_or_default()
}
}