use crate::RaftTypeConfig;
use crate::core::ServerState;
use crate::metrics::RaftMetrics;
use crate::vote::RaftTerm;
pub trait MetricsRecorder: Send + Sync + std::fmt::Debug {
fn record_apply_batch(&self, entry_count: u64);
fn record_append_batch(&self, entry_count: u64);
fn record_write_batch(&self, entry_count: u64);
fn set_current_term(&self, term: u64);
fn set_last_log_index(&self, index: u64);
fn set_committed_index(&self, index: u64);
fn set_applied_index(&self, index: u64);
fn set_snapshot_index(&self, index: u64);
fn set_purged_index(&self, index: u64);
fn set_server_state(&self, state: u8);
fn increment_vote(&self);
fn increment_heartbeat(&self);
fn increment_append(&self);
}
pub fn forward_metrics<C: RaftTypeConfig>(metrics: &RaftMetrics<C>, recorder: &dyn MetricsRecorder) {
if let Some(term) = metrics.current_term.as_u64() {
recorder.set_current_term(term);
}
if let Some(index) = metrics.last_log_index {
recorder.set_last_log_index(index);
}
if let Some(ref committed) = metrics.committed {
recorder.set_committed_index(committed.index());
}
if let Some(ref applied) = metrics.last_applied {
recorder.set_applied_index(applied.index());
}
if let Some(ref snapshot) = metrics.snapshot {
recorder.set_snapshot_index(snapshot.index());
}
if let Some(ref purged) = metrics.purged {
recorder.set_purged_index(purged.index());
}
recorder.set_server_state(match metrics.state {
ServerState::Learner => 0,
ServerState::Follower => 1,
ServerState::Candidate => 2,
ServerState::Leader => 3,
ServerState::Shutdown => 4,
});
}