@@ -95,46 +95,54 @@ async fn heartbeat(
9595 error ! ( "Heartbeat Error: {}" , e) ;
9696 }
9797 if let Some ( metrics) = heartbeat. metrics . clone ( ) {
98- // Get all previously reported metrics for this node
99- let previous_metrics = match app_state
98+ // Get current metric keys for this node efficiently using HKEYS
99+ let previous_metric_keys = match app_state
100100 . store_context
101101 . metrics_store
102- . get_metrics_for_node ( node_address)
102+ . get_metric_keys_for_node ( node_address)
103103 . await
104104 {
105- Ok ( metrics ) => metrics ,
105+ Ok ( keys ) => keys ,
106106 Err ( e) => {
107- error ! ( "Error getting metrics for node: {}" , e) ;
108- Default :: default ( )
107+ error ! ( "Error getting metric keys for node: {}" , e) ;
108+ Vec :: new ( )
109109 }
110110 } ;
111111
112- // Create a HashSet of new metrics for efficient lookup
113- let new_metrics_set: HashSet < _ > = metrics
112+ // Create a HashSet of new metric keys for efficient lookup
113+ let new_metrics_set: HashSet < String > = metrics
114114 . iter ( )
115- . map ( |metric| ( & metric. key . task_id , & metric. key . label ) )
115+ . map ( |metric| {
116+ let task_id = if metric. key . task_id . is_empty ( ) {
117+ "manual" . to_string ( )
118+ } else {
119+ metric. key . task_id . clone ( )
120+ } ;
121+ format ! ( "{}:{}" , task_id, metric. key. label. replace( ':' , "" ) )
122+ } )
116123 . collect ( ) ;
117124
118- // Clean up stale metrics from Redis only
119- // The sync service will handle all Prometheus updates
120- for ( task_id, task_metrics) in previous_metrics {
121- for ( label, _value) in task_metrics {
122- let prev_key = ( & task_id, & label) ;
123- if !new_metrics_set. contains ( & prev_key) {
124- // Remove from Redis metrics store
125- if let Err ( e) = app_state
126- . store_context
127- . metrics_store
128- . delete_metric ( & task_id, & label, & node_address. to_string ( ) )
129- . await
130- {
131- error ! ( "Error deleting metric: {}" , e) ;
132- }
125+ // Find stale metrics to delete
126+ let stale_metrics: Vec < String > = previous_metric_keys
127+ . into_iter ( )
128+ . filter ( |key| !new_metrics_set. contains ( key) )
129+ . collect ( ) ;
130+
131+ // Delete stale metrics efficiently
132+ for metric_key in stale_metrics {
133+ if let Some ( ( task_id, label) ) = metric_key. split_once ( ':' ) {
134+ if let Err ( e) = app_state
135+ . store_context
136+ . metrics_store
137+ . delete_metric ( task_id, label, & node_address. to_string ( ) )
138+ . await
139+ {
140+ error ! ( "Error deleting metric: {}" , e) ;
133141 }
134142 }
135143 }
136144
137- // Store new metrics in Redis only
145+ // Store new metrics in Redis
138146 if let Err ( e) = app_state
139147 . store_context
140148 . metrics_store
0 commit comments