use std::collections::HashMap;
#[derive(Default)]
pub struct PrometheusMetrics {
counters: HashMap<String, u64>,
gauges: HashMap<String, f64>,
labels: HashMap<String, Vec<(String, String)>>,
}
impl PrometheusMetrics {
pub fn new() -> Self {
Self::default()
}
pub fn increment_counter(&mut self, name: &str, label_name: &str, label_value: &str) {
let counter = self.counters.entry(name.to_string()).or_insert(0);
*counter += 1;
if !label_name.is_empty() && !label_value.is_empty() {
let labels = self.labels.entry(name.to_string()).or_default();
labels.push((label_name.to_string(), label_value.to_string()));
}
}
pub fn set_gauge(&mut self, name: &str, value: f64) {
self.gauges.insert(name.to_string(), value);
}
pub fn get_counter(&self, name: &str) -> Option<u64> {
self.counters.get(name).copied()
}
pub fn get_gauge(&self, name: &str) -> Option<f64> {
self.gauges.get(name).copied()
}
pub fn get_metrics_json(&self) -> HashMap<String, serde_json::Value> {
let mut result = HashMap::new();
for (name, value) in &self.counters {
result.insert(
format!("counter_{name}"),
serde_json::json!({
"value": value,
"type": "counter",
"labels": self.labels.get(name).unwrap_or(&Vec::new())
}),
);
}
for (name, value) in &self.gauges {
result.insert(
format!("gauge_{name}"),
serde_json::json!({
"value": value,
"type": "gauge",
"labels": self.labels.get(name).unwrap_or(&Vec::new())
}),
);
}
result
}
}