use std::collections::HashMap;
use std::io::BufRead;
pub struct ParsedMetrics {
pub gauges: HashMap<String, f64>,
pub counters: HashMap<String, f64>,
}
pub fn parse_prometheus_text(body: &str) -> Option<ParsedMetrics> {
let normalized = body.replace("vllm:", "vllm_");
let reader = std::io::BufReader::new(normalized.as_bytes());
let scrape = prometheus_parse::Scrape::parse(reader.lines()).ok()?;
let mut gauges = HashMap::new();
let mut counters = HashMap::new();
for sample in &scrape.samples {
match &sample.value {
prometheus_parse::Value::Gauge(v) => {
gauges.insert(sample.metric.clone(), *v);
}
prometheus_parse::Value::Counter(v) => {
counters.insert(sample.metric.clone(), *v);
}
prometheus_parse::Value::Histogram(_) => {
}
prometheus_parse::Value::Summary(_) => {
}
prometheus_parse::Value::Untyped(v) => {
let name = &sample.metric;
if name.ends_with("_sum") || name.ends_with("_count") || name.ends_with("_total") {
counters.insert(name.clone(), *v);
} else {
gauges.insert(name.clone(), *v);
}
}
}
}
Some(ParsedMetrics { gauges, counters })
}