fn compose()

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),
        }
    }