in src/protocol/admin/src/admin.rs [116:162]
fn compose(&self, buf: &mut dyn BufMut) -> usize {
match self {
Self::Hangup => 0,
Self::Ok => {
buf.put_slice(b"OK\r\n");
4
}
Self::Stats => {
let mut size = 0;
let mut data = Vec::new();
for metric in &rustcommon_metrics::metrics() {
let any = match metric.as_any() {
Some(any) => any,
None => {
continue;
}
};
if let Some(counter) = any.downcast_ref::<Counter>() {
data.push(format!("STAT {} {}\r\n", metric.name(), counter.value()));
} else if let Some(gauge) = any.downcast_ref::<Gauge>() {
data.push(format!("STAT {} {}\r\n", metric.name(), gauge.value()));
} else if let Some(heatmap) = any.downcast_ref::<Heatmap>() {
for (label, value) in PERCENTILES {
let percentile =
heatmap.percentile(*value).map(|b| b.high()).unwrap_or(0);
data.push(format!(
"STAT {}_{} {}\r\n",
metric.name(),
label,
percentile
));
}
}
}
data.sort();
for line in data {
size += line.as_bytes().len();
buf.put_slice(line.as_bytes());
}
buf.put_slice(b"END\r\n");
size + 5
}
Self::Version(v) => v.compose(buf),
}
}