prometheus_measures_exporter/
measurer.rs

1use prometheus::core::Collector;
2use prometheus::Registry;
3
4use crate::{MeasureBuilder, ENABLE_PROMETHEUS};
5
6pub fn create_and_register_measurer<T: 'static, OPTS>(registry: &Registry, opts: OPTS) -> T
7where
8    T: Collector + MeasureBuilder<OPTS> + Clone,
9{
10    let measurer: T = MeasureBuilder::<OPTS>::build(opts);
11    if *ENABLE_PROMETHEUS.lock().unwrap() {
12        match registry.register(Box::new(measurer.clone())) {
13            Ok(_) => {}
14            Err(e) => {
15                panic!("Enable register prometheus measurer {:?}", e)
16            }
17        };
18    }
19    measurer
20}
21
22#[cfg(test)]
23mod test {
24    use prometheus::proto::MetricFamily;
25    use prometheus::{IntCounter, Opts, Registry};
26
27    use crate::measurer::create_and_register_measurer;
28    use crate::ENABLE_PROMETHEUS;
29
30    #[test]
31    pub fn test() {
32        *ENABLE_PROMETHEUS.lock().unwrap() = true;
33        let registry = Registry::new();
34        let counter = create_and_register_measurer::<IntCounter, _>(
35            &registry,
36            Opts::new("name", "help").const_labels(
37                vec![("label".to_string(), "value".to_string())]
38                    .into_iter()
39                    .collect(),
40            ),
41        );
42
43        counter.inc();
44
45        let metrics = registry.gather();
46        assert_eq!(metrics.len(), 1);
47        let metric_family: &MetricFamily = metrics.first().unwrap();
48        assert_eq!(metric_family.get_name(), "name");
49        assert_eq!(metric_family.get_help(), "help");
50        let metric = &metric_family.get_metric()[0];
51        assert_eq!(metric.get_counter().get_value(), 1.0);
52        let label = metric.get_label().first().unwrap();
53        assert_eq!(label.get_name(), "label");
54        assert_eq!(label.get_value(), "value");
55    }
56}