impl WorkerMetrics {
pub fn new(id: usize) -> Self {
Self {
id,
state: WorkerState::Idle,
processed_count: 0,
failed_count: 0,
last_heartbeat: Instant::now(),
recent_errors: Vec::new(),
avg_processing_time_ms: 0.0,
heartbeat_count: 0,
custom_metrics: HashMap::new(),
}
}
pub fn record_success(&mut self, processing_time_ms: u64) {
self.processed_count += 1;
self.state = WorkerState::Idle;
self.avg_processing_time_ms = (self.avg_processing_time_ms
* (self.processed_count as f64 - 1.0)
+ processing_time_ms as f64)
/ self.processed_count as f64;
}
pub fn record_failure(&mut self, error: &str) {
self.failed_count += 1;
self.state = WorkerState::Idle;
self.recent_errors.push(error.to_string());
if self.recent_errors.len() > 5 {
self.recent_errors.remove(0);
}
}
pub fn update_heartbeat(&mut self) {
self.last_heartbeat = Instant::now();
self.heartbeat_count += 1;
}
pub fn is_stalled(&self, timeout: Duration) -> bool {
if self.state == WorkerState::Processing {
self.last_heartbeat.elapsed() > timeout
} else {
false
}
}
pub fn set_state(&mut self, state: WorkerState) {
self.state = state;
self.update_heartbeat();
}
pub fn set_custom_metric(&mut self, key: &str, value: &str) {
self.custom_metrics
.insert(key.to_string(), value.to_string());
}
pub fn time_since_heartbeat(&self) -> Duration {
self.last_heartbeat.elapsed()
}
}