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

macro metrics-derive

Proc macro for automatically describing and initializing metrics

1 unstable release

0.1.0 Sep 30, 2024

#332 in Procedural macros

Download history 7584/week @ 2024-11-16 9029/week @ 2024-11-23 8114/week @ 2024-11-30 9097/week @ 2024-12-07 6758/week @ 2024-12-14 5936/week @ 2024-12-21 5857/week @ 2024-12-28 9553/week @ 2025-01-04 8011/week @ 2025-01-11 9308/week @ 2025-01-18 10649/week @ 2025-01-25 10624/week @ 2025-02-01 12144/week @ 2025-02-08 10048/week @ 2025-02-15 11359/week @ 2025-02-22 10319/week @ 2025-03-01

45,742 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–3.5MB
~68K SLoC