metrics/
registry.rs

1// Copyright 2019 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4
5use crate::metrics::Metric;
6use lazy_static::lazy_static;
7use parking_lot::RwLock;
8use std::{collections::HashMap, sync::Arc};
9
10lazy_static! {
11    pub static ref DEFAULT_REGISTRY: RwLock<Registry> =
12        RwLock::new(Registry::default());
13    pub static ref DEFAULT_GROUPING_REGISTRY: RwLock<GroupingRegistry> =
14        RwLock::new(GroupingRegistry::default());
15}
16
17#[derive(Default)]
18pub struct Registry {
19    metrics: HashMap<String, Arc<dyn Metric>>,
20}
21
22impl Registry {
23    pub fn register(&mut self, name: String, metric: Arc<dyn Metric>) {
24        assert!(!self.metrics.contains_key(&name));
25        self.metrics.insert(name, metric);
26    }
27
28    pub fn get_all(&self) -> &HashMap<String, Arc<dyn Metric>> { &self.metrics }
29
30    pub fn clear(&mut self) { self.metrics.clear(); }
31}
32
33#[derive(Default)]
34pub struct GroupingRegistry {
35    groups: HashMap<String, HashMap<String, Arc<dyn Metric>>>,
36}
37
38impl GroupingRegistry {
39    pub fn register(
40        &mut self, group_name: String, metric_name: String,
41        metric: Arc<dyn Metric>,
42    ) {
43        let group_entry =
44            self.groups.entry(group_name).or_insert_with(HashMap::new);
45        assert!(
46            !group_entry.contains_key(&metric_name),
47            "Metric name {:?} already exists in the group ",
48            &metric_name
49        );
50        group_entry.insert(metric_name, metric);
51    }
52
53    pub fn get_all(
54        &self,
55    ) -> &HashMap<String, HashMap<String, Arc<dyn Metric>>> {
56        &self.groups
57    }
58
59    pub fn clear(&mut self) { self.groups.clear(); }
60}