11use metrics:: { KeyName , SharedString , Unit } ;
22use metrics_util:: MetricKind ;
3- use std :: collections :: HashMap ;
4- use std:: sync:: { Arc , PoisonError , RwLock } ;
3+ use scc :: HashMap ;
4+ use std:: sync:: Arc ;
55
66#[ derive( Clone ) ]
77pub struct MetricDescription {
@@ -20,58 +20,44 @@ impl MetricDescription {
2020}
2121
2222/// Stores all metric metadata including descriptions and histogram bounds
23- #[ derive( Default ) ]
23+ #[ derive( Clone , Default ) ]
2424pub struct MetricMetadata {
25- inner : Arc < RwLock < MetricMetadataInner > > ,
26- }
27-
28- #[ derive( Default ) ]
29- struct MetricMetadataInner {
30- descriptions : HashMap < ( KeyName , MetricKind ) , MetricDescription > ,
31- histogram_bounds : HashMap < KeyName , Vec < f64 > > ,
25+ descriptions : Arc < HashMap < ( KeyName , MetricKind ) , MetricDescription > > ,
26+ histogram_bounds : Arc < HashMap < KeyName , Vec < f64 > > > ,
3227}
3328
3429impl MetricMetadata {
3530 pub fn new ( ) -> Self {
36- Self :: default ( )
31+ Self {
32+ descriptions : Arc :: new ( HashMap :: new ( ) ) ,
33+ histogram_bounds : Arc :: new ( HashMap :: new ( ) ) ,
34+ }
3735 }
3836
39- pub fn add_description (
37+ pub fn set_description (
4038 & self ,
4139 key_name : KeyName ,
4240 metric_kind : MetricKind ,
4341 unit : Option < Unit > ,
4442 description : SharedString ,
4543 ) {
4644 let new_entry = MetricDescription { unit, description } ;
47- let mut inner = self . inner . write ( ) . unwrap_or_else ( PoisonError :: into_inner) ;
48- inner. descriptions . insert ( ( key_name, metric_kind) , new_entry) ;
45+ let _ = self . descriptions . insert ( ( key_name, metric_kind) , new_entry) ;
4946 }
5047
5148 pub fn get_description (
5249 & self ,
5350 key_name : & KeyName ,
5451 metric_kind : MetricKind ,
5552 ) -> Option < MetricDescription > {
56- let inner = self . inner . read ( ) . unwrap_or_else ( PoisonError :: into_inner) ;
57- inner. descriptions . get ( & ( key_name. clone ( ) , metric_kind) ) . cloned ( )
53+ self . descriptions . read ( & ( key_name. clone ( ) , metric_kind) , |_, v| v. clone ( ) )
5854 }
5955
6056 pub fn set_histogram_bounds ( & self , key_name : KeyName , bounds : Vec < f64 > ) {
61- let mut inner = self . inner . write ( ) . unwrap_or_else ( PoisonError :: into_inner) ;
62- inner. histogram_bounds . insert ( key_name, bounds) ;
57+ let _ = self . histogram_bounds . insert ( key_name, bounds) ;
6358 }
6459
6560 pub fn get_histogram_bounds ( & self , key_name : & KeyName ) -> Option < Vec < f64 > > {
66- let inner = self . inner . read ( ) . unwrap_or_else ( PoisonError :: into_inner) ;
67- inner. histogram_bounds . get ( key_name) . cloned ( )
61+ self . histogram_bounds . read ( key_name, |_, v| v. clone ( ) )
6862 }
6963}
70-
71- impl Clone for MetricMetadata {
72- fn clone ( & self ) -> Self {
73- Self {
74- inner : Arc :: clone ( & self . inner ) ,
75- }
76- }
77- }
0 commit comments