1use 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}