1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
use crate::MetricEntry;
#[non_exhaustive]
pub enum Format {
/// A metrics format that represents the metric using only a simple name. If
/// a metric's name depends on metadata associated with it, the formatter
/// should ensure that the output name is unique.
///
/// Examples:
/// `cpu/usage/user`
/// `cpu/usage/system`
/// `network/eth0/transmit/bytes`
Simple,
/// A metrics format that represents the metric using a name and associated
/// metadata in the Prometheus exposition format.
///
/// Examples:
/// `cpu_usage{mode="user"}`
/// `cpu_usage{mode="system"}`
/// `network_transmit_bytes{device="eth0"}`
Prometheus,
}
/// The default formatter supports Prometheus-style exposition, and otherwise
/// simply prints the metric name.
pub fn default_formatter(metric: &MetricEntry, format: Format) -> String {
match format {
Format::Prometheus => {
let metadata: Vec<String> = metric
.metadata()
.iter()
.map(|(key, value)| format!("{key}=\"{value}\""))
.collect();
let metadata = metadata.join(", ");
if metadata.is_empty() {
metric.name().to_string()
} else {
format!("{}{{{metadata}}}", metric.name())
}
}
_ => metric.name().to_string(),
}
}