16
16
*
17
17
*/
18
18
19
+ use std:: collections:: HashMap ;
19
20
use std:: sync:: Arc ;
20
21
22
+ use once_cell:: sync:: Lazy ;
21
23
use prometheus:: core:: Collector ;
22
24
use prometheus:: proto:: MetricFamily ;
23
25
use prometheus:: IntGaugeVec ;
@@ -171,15 +173,15 @@ pub fn delete_stats(stream_name: &str, format: &'static str) -> prometheus::Resu
171
173
let event_labels = event_labels ( stream_name, format) ;
172
174
let storage_size_labels = storage_size_labels ( stream_name) ;
173
175
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) ;
183
185
184
186
delete_with_label_prefix ( & EVENTS_INGESTED_DATE , & event_labels) ;
185
187
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
188
190
Ok ( ( ) )
189
191
}
190
192
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
+
191
200
fn delete_with_label_prefix ( metrics : & IntGaugeVec , prefix : & [ & str ] ) {
192
201
let families: Vec < MetricFamily > = metrics. collect ( ) . into_iter ( ) . collect ( ) ;
193
202
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
+ }
200
216
}
201
217
}
202
218
}
0 commit comments