use std::borrow::Cow;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub enum MetricKind {
Counter,
Gauge,
Timer,
Rate,
Histogram,
}
impl MetricKind {
#[inline]
pub const fn as_prometheus_type(self) -> &'static str {
match self {
MetricKind::Counter => "counter",
MetricKind::Gauge => "gauge",
MetricKind::Timer => "histogram",
MetricKind::Rate => "gauge",
MetricKind::Histogram => "histogram",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub enum Unit {
#[default]
None,
Seconds,
Milliseconds,
Microseconds,
Nanoseconds,
Bytes,
Kilobytes,
Megabytes,
Gigabytes,
Percent,
Ratio,
Custom(&'static str),
}
impl Unit {
pub const fn as_str(self) -> &'static str {
match self {
Unit::None => "",
Unit::Seconds => "seconds",
Unit::Milliseconds => "milliseconds",
Unit::Microseconds => "microseconds",
Unit::Nanoseconds => "nanoseconds",
Unit::Bytes => "bytes",
Unit::Kilobytes => "kilobytes",
Unit::Megabytes => "megabytes",
Unit::Gigabytes => "gigabytes",
Unit::Percent => "percent",
Unit::Ratio => "ratio",
Unit::Custom(s) => s,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct MetricMetadata {
pub help: Cow<'static, str>,
pub unit: Unit,
pub kind: MetricKind,
}
impl MetricMetadata {
pub fn new(kind: MetricKind, help: impl Into<Cow<'static, str>>, unit: Unit) -> Self {
Self {
kind,
help: help.into(),
unit,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn unit_strings_match_prometheus_conventions() {
assert_eq!(Unit::Seconds.as_str(), "seconds");
assert_eq!(Unit::Bytes.as_str(), "bytes");
assert_eq!(Unit::None.as_str(), "");
assert_eq!(Unit::Custom("foo").as_str(), "foo");
}
#[test]
fn kind_prometheus_type_tokens_are_lowercase() {
for k in [
MetricKind::Counter,
MetricKind::Gauge,
MetricKind::Timer,
MetricKind::Rate,
MetricKind::Histogram,
] {
let s = k.as_prometheus_type();
assert!(s.chars().all(|c| c.is_ascii_lowercase()));
}
}
}