use std::sync::Arc;
use async_trait::async_trait;
use tracing::debug;
use crate::error::Result;
use crate::rebalancer::metrics::{LoadMetrics, LoadMetricsProvider};
use crate::transport::NexarTransport;
pub struct NexarTransportMetricsProvider {
transport: Arc<NexarTransport>,
}
impl NexarTransportMetricsProvider {
pub fn new(transport: Arc<NexarTransport>) -> Self {
Self { transport }
}
}
#[async_trait]
impl LoadMetricsProvider for NexarTransportMetricsProvider {
async fn snapshot(&self) -> Result<Vec<LoadMetrics>> {
let peers = self.transport.peer_snapshot();
debug!(
peer_count = peers.len(),
"transport metrics provider: remote load metrics RPC not yet \
implemented; returning zero-valued remote entries"
);
let local = LoadMetrics {
node_id: self.transport.node_id(),
vshards_led: 0,
bytes_stored: 0,
writes_per_sec: 0.0,
reads_per_sec: 0.0,
qps_recent: 0.0,
p95_latency_us: 0,
cpu_utilization: 0.0,
};
let mut result = vec![local];
for peer in &peers {
result.push(LoadMetrics {
node_id: peer.peer_id,
vshards_led: 0,
bytes_stored: 0,
writes_per_sec: 0.0,
reads_per_sec: 0.0,
qps_recent: 0.0,
p95_latency_us: 0,
cpu_utilization: 0.0,
});
}
Ok(result)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_send_sync<T: Send + Sync>() {}
#[test]
fn nexar_transport_metrics_provider_is_send_sync() {
_assert_send_sync::<NexarTransportMetricsProvider>();
}
}