torrust-metrics 0.1.0

Prometheus metrics integration library providing type-safe metric collection and aggregation.
Documentation
use crate::metric::MetricName;

#[derive(thiserror::Error, Debug, Clone)]
pub enum Error {
    #[error("Metric names must be unique across all metrics types.")]
    MetricNameCollisionInConstructor {
        counter_names: Vec<String>,
        gauge_names: Vec<String>,
    },

    #[error("Found duplicate metric name in list. Metric names must be unique across all metrics types.")]
    DuplicateMetricNameInList { metric_name: MetricName },

    #[error("Cannot merge metric '{metric_name}': it already exists in the current collection")]
    MetricNameCollisionInMerge { metric_name: MetricName },

    #[error("Cannot create metric with name '{metric_name}': another metric with this name already exists")]
    MetricNameCollisionAdding { metric_name: MetricName },
}

#[cfg(test)]
mod tests {
    use super::Error;
    use crate::metric_name;

    #[test]
    fn it_should_display_metric_name_collision_in_constructor() {
        let err = Error::MetricNameCollisionInConstructor {
            counter_names: vec!["hits_total".to_owned()],
            gauge_names: vec!["temperature".to_owned()],
        };
        let msg = err.to_string();
        assert!(msg.contains("unique"));
    }

    #[test]
    fn it_should_display_duplicate_metric_name_in_list() {
        let err = Error::DuplicateMetricNameInList {
            metric_name: metric_name!("hits_total"),
        };
        let msg = err.to_string();
        assert!(msg.contains("duplicate") || msg.contains("Duplicate"));
    }

    #[test]
    fn it_should_display_metric_name_collision_in_merge() {
        let err = Error::MetricNameCollisionInMerge {
            metric_name: metric_name!("hits_total"),
        };
        let msg = err.to_string();
        assert!(msg.contains("hits_total"));
    }

    #[test]
    fn it_should_display_metric_name_collision_adding() {
        let err = Error::MetricNameCollisionAdding {
            metric_name: metric_name!("hits_total"),
        };
        let msg = err.to_string();
        assert!(msg.contains("hits_total"));
    }

    #[test]
    fn it_should_be_cloneable() {
        let err = Error::MetricNameCollisionAdding {
            metric_name: metric_name!("hits_total"),
        };
        let cloned = err.clone();
        assert_eq!(err.to_string(), cloned.to_string());
    }
}