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 = self.groups.entry(group_name).or_default();
44 assert!(
45 !group_entry.contains_key(&metric_name),
46 "Metric name {:?} already exists in the group ",
47 &metric_name
48 );
49 group_entry.insert(metric_name, metric);
50 }
51
52 pub fn get_all(
53 &self,
54 ) -> &HashMap<String, HashMap<String, Arc<dyn Metric>>> {
55 &self.groups
56 }
57
58 pub fn clear(&mut self) { self.groups.clear(); }
59}