#[macro_export]
macro_rules! define_metrics {
(
metrics_fn: $metrics_fn:path;
struct $struct_name:ident {
$(
$metric_type:ident $metric_name:literal => $field_name:ident : $help:literal
$(labels: [$($label:literal),* $(,)?])?
$(buckets: [$($bucket:literal),* $(,)?])?
);* $(;)?
}
) => {
#[derive(Clone)]
pub struct $struct_name {
registry: ::prometheus::Registry,
$(
pub $field_name: $crate::metric_field_type!($metric_type),
)*
}
impl $struct_name {
pub fn new() -> ::std::result::Result<Self, ::prometheus::Error> {
let registry = ::prometheus::Registry::new();
$(
let $field_name = $crate::create_metric!(
$metric_type,
$metric_name,
$help
$(, labels: [$($label),*])?
$(, buckets: [$($bucket),*])?
)?;
registry.register(Box::new($field_name.clone()))?;
)*
Ok(Self {
registry,
$($field_name,)*
})
}
pub fn registry(&self) -> &::prometheus::Registry {
&self.registry
}
}
$(
#[doc = concat!("Get the `", stringify!($field_name), "` metric")]
#[inline]
pub fn $field_name() -> &'static $crate::metric_field_type!($metric_type) {
&$metrics_fn().$field_name
}
)*
};
}
#[macro_export]
macro_rules! metric_field_type {
(counter) => {
::prometheus::IntCounter
};
(counter_vec) => {
::prometheus::IntCounterVec
};
(gauge) => {
::prometheus::IntGauge
};
(gauge_vec) => {
::prometheus::IntGaugeVec
};
(histogram) => {
::prometheus::HistogramVec
};
}
#[macro_export]
macro_rules! create_metric {
(counter, $name:literal, $help:literal) => {
::prometheus::IntCounter::new($name, $help)
};
(counter_vec, $name:literal, $help:literal, labels: [$($label:literal),*]) => {
::prometheus::IntCounterVec::new(
::prometheus::Opts::new($name, $help),
&[$($label),*]
)
};
(gauge, $name:literal, $help:literal) => {
::prometheus::IntGauge::new($name, $help)
};
(gauge_vec, $name:literal, $help:literal, labels: [$($label:literal),*]) => {
::prometheus::IntGaugeVec::new(
::prometheus::Opts::new($name, $help),
&[$($label),*]
)
};
(histogram, $name:literal, $help:literal, labels: [$($label:literal),*], buckets: [$($bucket:literal),*]) => {
::prometheus::HistogramVec::new(
::prometheus::HistogramOpts::new($name, $help)
.buckets(vec![$($bucket as f64),*]),
&[$($label),*]
)
};
}