@@ -27,25 +27,62 @@ pub struct Stats {
2727}
2828
2929pub fn get_current_stats ( stream_name : & str , format : & ' static str ) -> Option < Stats > {
30+ let event_labels = event_labels ( stream_name, format) ;
31+ let storage_size_labels = storage_size_labels ( stream_name) ;
32+
3033 let events_ingested = EVENTS_INGESTED
31- . get_metric_with_label_values ( & [ stream_name , format ] )
34+ . get_metric_with_label_values ( & event_labels )
3235 . ok ( ) ?
3336 . get ( ) ;
3437 let ingestion_size = EVENTS_INGESTED_SIZE
35- . get_metric_with_label_values ( & [ stream_name , format ] )
38+ . get_metric_with_label_values ( & event_labels )
3639 . ok ( ) ?
3740 . get ( ) ;
3841 let storage_size = STORAGE_SIZE
39- . get_metric_with_label_values ( & [ "data" , stream_name , "parquet" ] )
42+ . get_metric_with_label_values ( & storage_size_labels )
4043 . ok ( ) ?
4144 . get ( ) ;
4245 // this should be valid for all cases given that gauge must never go negative
4346 let ingestion_size = ingestion_size as u64 ;
4447 let storage_size = storage_size as u64 ;
4548
46- Some ( Stats {
47- events : events_ingested,
48- ingestion : ingestion_size,
49- storage : storage_size,
50- } )
49+ // If all metrics are 0, it is presumed that 'stream_name' does not exist and therefore has no stats
50+ if events_ingested == 0 && ingestion_size == 0 && storage_size == 0 {
51+ None
52+ } else {
53+ Some ( Stats {
54+ events : events_ingested,
55+ ingestion : ingestion_size,
56+ storage : storage_size,
57+ } )
58+ }
59+ }
60+
61+ pub fn delete_stats ( stream_name : & str , format : & ' static str ) -> prometheus:: Result < ( ) > {
62+ let event_labels = event_labels ( stream_name, format) ;
63+ let storage_size_labels = storage_size_labels ( stream_name) ;
64+
65+ EVENTS_INGESTED . remove_label_values ( & event_labels) ?;
66+ EVENTS_INGESTED_SIZE . remove_label_values ( & event_labels) ?;
67+ STORAGE_SIZE . remove_label_values ( & storage_size_labels) ?;
68+
69+ Ok ( ( ) )
70+ }
71+
72+ fn event_labels < ' a > ( stream_name : & ' a str , format : & ' static str ) -> [ & ' a str ; 2 ] {
73+ [ stream_name, format]
74+ }
75+
76+ fn storage_size_labels ( stream_name : & str ) -> [ & str ; 3 ] {
77+ [ "data" , stream_name, "parquet" ]
78+ }
79+
80+ #[ cfg( test) ]
81+ mod tests {
82+ use crate :: stats:: get_current_stats;
83+
84+ #[ test]
85+ fn get_current_stats_returns_none_without_data ( ) {
86+ assert ! ( get_current_stats( "test" , "json" ) . is_none( ) )
87+ }
5188}
0 commit comments