prometheus_measures_exporter/
measurer.rs1use 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 ®istry,
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}