#metrics #proc-macro #gauge #macro-derive #automatic #counter #description

macro metrics-derive

Proc macro for automatically describing and initializing metrics

1 unstable release

0.1.0 Sep 30, 2024

#250 in Procedural macros

Download history 2988/week @ 2024-09-28 4568/week @ 2024-10-05 6618/week @ 2024-10-12 9254/week @ 2024-10-19 7101/week @ 2024-10-26 6787/week @ 2024-11-02 6993/week @ 2024-11-09 7584/week @ 2024-11-16 9029/week @ 2024-11-23 8247/week @ 2024-11-30

33,311 downloads per month

MIT/Apache

28KB
461 lines

metrics-derive

metrics-derive provides the Metrics derive macro, allowing you to automatically implement metrics description and initialization.

Originally introduced in paradigmxyz/reth repository in https://github.com/paradigmxyz/reth/pull/592.

Installation

To use metrics-derive, add it to your Cargo.toml:

[dependencies]
metrics-derive = "0.1"

This crate requires a metrics peer dependency.

Usage

use metrics::{Counter, Gauge, Histogram};
use metrics_derive::Metrics;

#[derive(Metrics)]
#[metrics(scope = "metrics_custom")]
pub struct CustomMetrics {
    /// A gauge with doc comment description.
    gauge: Gauge,
    #[metric(rename = "second_gauge", describe = "A gauge with metric attribute description.")]
    gauge2: Gauge,
    /// Some doc comment
    #[metric(describe = "Metric attribute description will be preferred over doc comment.")]
    counter: Counter,
    /// A renamed histogram.
    #[metric(rename = "histogram")]
    histo: Histogram,
}

The example above will be expanded to:

pub struct CustomMetrics {
    /// A gauge with doc comment description.
    gauge: metrics::Gauge,
    gauge2: metrics::Gauge,
    /// Some doc comment
    counter: metrics::Counter,
    /// A renamed histogram.
    histo: metrics::Histogram,
}

impl Default for CustomMetrics {
    fn default() -> Self {
        Self {
            gauge: metrics::gauge!("metrics_custom_gauge"),
            gauge2: metrics::gauge!("metrics_custom_second_gauge"),
            counter: metrics::counter!("metrics_custom_counter"),
            histo: metrics::histogram!("metrics_custom_histogram"),
        }
    }
}

impl CustomMetrics {
    /// Describe all exposed metrics
    pub fn describe() {
        metrics::describe_gauge!(
            "metrics_custom_gauge",
            "A gauge with doc comment description."
        );
        metrics::describe_gauge!(
            "metrics_custom_second_gauge",
            "A gauge with metric attribute description."
        );
        metrics::describe_counter!(
            "metrics_custom_counter",
            "Metric attribute description will be preferred over doc comment."
        );
        metrics::describe_histogram!("metrics_custom_histogram", "A renamed histogram.");
    }
}

impl std::fmt::Debug for CustomMetrics {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("CustomMetrics").finish()
    }
}

Dependencies

~2.3–4MB
~69K SLoC