1616 *
1717 */
1818
19+ use std:: collections:: HashMap ;
1920use std:: sync:: Arc ;
2021
22+ use once_cell:: sync:: Lazy ;
2123use prometheus:: core:: Collector ;
2224use prometheus:: proto:: MetricFamily ;
2325use prometheus:: IntGaugeVec ;
@@ -171,15 +173,15 @@ pub fn delete_stats(stream_name: &str, format: &'static str) -> prometheus::Resu
171173 let event_labels = event_labels ( stream_name, format) ;
172174 let storage_size_labels = storage_size_labels ( stream_name) ;
173175
174- EVENTS_INGESTED . remove_label_values ( & event_labels) ? ;
175- EVENTS_INGESTED_SIZE . remove_label_values ( & event_labels) ? ;
176- STORAGE_SIZE . remove_label_values ( & storage_size_labels) ? ;
177- EVENTS_DELETED . remove_label_values ( & event_labels) ? ;
178- EVENTS_DELETED_SIZE . remove_label_values ( & event_labels) ? ;
179- DELETED_EVENTS_STORAGE_SIZE . remove_label_values ( & storage_size_labels) ? ;
180- LIFETIME_EVENTS_INGESTED . remove_label_values ( & event_labels) ? ;
181- LIFETIME_EVENTS_INGESTED_SIZE . remove_label_values ( & event_labels) ? ;
182- LIFETIME_EVENTS_STORAGE_SIZE . remove_label_values ( & storage_size_labels) ? ;
176+ remove_label_values ( & EVENTS_INGESTED , & event_labels) ;
177+ remove_label_values ( & EVENTS_INGESTED_SIZE , & event_labels) ;
178+ remove_label_values ( & STORAGE_SIZE , & storage_size_labels) ;
179+ remove_label_values ( & EVENTS_DELETED , & event_labels) ;
180+ remove_label_values ( & EVENTS_DELETED_SIZE , & event_labels) ;
181+ remove_label_values ( & DELETED_EVENTS_STORAGE_SIZE , & storage_size_labels) ;
182+ remove_label_values ( & LIFETIME_EVENTS_INGESTED , & event_labels) ;
183+ remove_label_values ( & LIFETIME_EVENTS_INGESTED_SIZE , & event_labels) ;
184+ remove_label_values ( & LIFETIME_EVENTS_STORAGE_SIZE , & storage_size_labels) ;
183185
184186 delete_with_label_prefix ( & EVENTS_INGESTED_DATE , & event_labels) ;
185187 delete_with_label_prefix ( & EVENTS_INGESTED_SIZE_DATE , & event_labels) ;
@@ -188,15 +190,29 @@ pub fn delete_stats(stream_name: &str, format: &'static str) -> prometheus::Resu
188190 Ok ( ( ) )
189191}
190192
193+ #[ inline]
194+ fn remove_label_values ( lazy_static : & Lazy < IntGaugeVec > , event_labels : & [ & str ] ) {
195+ if let Err ( e) = lazy_static. remove_label_values ( event_labels) {
196+ warn ! ( "Unable to delete labels- {event_labels:?}\n with error- {e}" ) ;
197+ }
198+ }
199+
191200fn delete_with_label_prefix ( metrics : & IntGaugeVec , prefix : & [ & str ] ) {
192201 let families: Vec < MetricFamily > = metrics. collect ( ) . into_iter ( ) . collect ( ) ;
193202 for metric in families. iter ( ) . flat_map ( |m| m. get_metric ( ) ) {
194- let label: Vec < & str > = metric. get_label ( ) . iter ( ) . map ( |l| l. get_value ( ) ) . collect ( ) ;
195- if !label. starts_with ( prefix) {
196- continue ;
197- }
198- if let Err ( err) = metrics. remove_label_values ( & label) {
199- warn ! ( "Error = {err}" ) ;
203+ let label_map: HashMap < & str , & str > = metric
204+ . get_label ( )
205+ . iter ( )
206+ . map ( |l| ( l. get_name ( ) , l. get_value ( ) ) )
207+ . collect ( ) ;
208+
209+ // Check if all prefix elements are present in label values
210+ let all_prefixes_found = prefix. iter ( ) . all ( |p| label_map. values ( ) . any ( |v| v == p) ) ;
211+
212+ if all_prefixes_found {
213+ if let Err ( err) = metrics. remove ( & label_map) {
214+ warn ! ( "Error removing metric with labels {:?}: {err}" , label_map) ;
215+ }
200216 }
201217 }
202218}
0 commit comments