mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-09-03 01:25:37 +00:00
add stats metrics (#1207)
support new cli command `easytier-cli stats` It's useful to find out which components are consuming bandwidth.
This commit is contained in:
@@ -8,6 +8,7 @@ use std::{
|
||||
},
|
||||
};
|
||||
|
||||
use arc_swap::ArcSwapOption;
|
||||
use futures::{StreamExt, TryFutureExt};
|
||||
|
||||
use prost::Message;
|
||||
@@ -27,6 +28,7 @@ use crate::{
|
||||
defer,
|
||||
error::Error,
|
||||
global_ctx::ArcGlobalCtx,
|
||||
stats_manager::{CounterHandle, LabelSet, LabelType, MetricName},
|
||||
PeerId,
|
||||
},
|
||||
proto::{
|
||||
@@ -85,6 +87,13 @@ impl PeerConnCloseNotify {
|
||||
}
|
||||
}
|
||||
|
||||
struct PeerConnCounter {
|
||||
traffic_tx_bytes: CounterHandle,
|
||||
traffic_rx_bytes: CounterHandle,
|
||||
traffic_tx_packets: CounterHandle,
|
||||
traffic_rx_packets: CounterHandle,
|
||||
}
|
||||
|
||||
pub struct PeerConn {
|
||||
conn_id: PeerConnId,
|
||||
|
||||
@@ -111,6 +120,8 @@ pub struct PeerConn {
|
||||
latency_stats: Arc<WindowLatency>,
|
||||
throughput: Arc<Throughput>,
|
||||
loss_rate_stats: Arc<AtomicU32>,
|
||||
|
||||
counters: ArcSwapOption<PeerConnCounter>,
|
||||
}
|
||||
|
||||
impl Debug for PeerConn {
|
||||
@@ -164,6 +175,8 @@ impl PeerConn {
|
||||
latency_stats: Arc::new(WindowLatency::new(15)),
|
||||
throughput,
|
||||
loss_rate_stats: Arc::new(AtomicU32::new(0)),
|
||||
|
||||
counters: ArcSwapOption::new(None),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,6 +375,22 @@ impl PeerConn {
|
||||
let ctrl_sender = self.ctrl_resp_sender.clone();
|
||||
let conn_info_for_instrument = self.get_conn_info();
|
||||
|
||||
let stats_mgr = self.global_ctx.stats_manager();
|
||||
let label_set = LabelSet::new().with_label_type(LabelType::NetworkName(
|
||||
conn_info_for_instrument.network_name.clone(),
|
||||
));
|
||||
let counters = PeerConnCounter {
|
||||
traffic_tx_bytes: stats_mgr.get_counter(MetricName::TrafficBytesTx, label_set.clone()),
|
||||
traffic_rx_bytes: stats_mgr.get_counter(MetricName::TrafficBytesRx, label_set.clone()),
|
||||
traffic_tx_packets: stats_mgr
|
||||
.get_counter(MetricName::TrafficPacketsTx, label_set.clone()),
|
||||
traffic_rx_packets: stats_mgr
|
||||
.get_counter(MetricName::TrafficPacketsRx, label_set.clone()),
|
||||
};
|
||||
self.counters.store(Some(Arc::new(counters)));
|
||||
|
||||
let counters = self.counters.load_full().unwrap();
|
||||
|
||||
self.tasks.spawn(
|
||||
async move {
|
||||
tracing::info!("start recving peer conn packet");
|
||||
@@ -374,6 +403,10 @@ impl PeerConn {
|
||||
}
|
||||
|
||||
let mut zc_packet = ret.unwrap();
|
||||
|
||||
counters.traffic_rx_bytes.add(zc_packet.buf_len() as u64);
|
||||
counters.traffic_rx_packets.inc();
|
||||
|
||||
let Some(peer_mgr_hdr) = zc_packet.mut_peer_manager_header() else {
|
||||
tracing::error!(
|
||||
"unexpected packet: {:?}, cannot decode peer manager hdr",
|
||||
@@ -436,6 +469,11 @@ impl PeerConn {
|
||||
}
|
||||
|
||||
pub async fn send_msg(&self, msg: ZCPacket) -> Result<(), Error> {
|
||||
let counters = self.counters.load();
|
||||
if let Some(ref counters) = *counters {
|
||||
counters.traffic_tx_bytes.add(msg.buf_len() as u64);
|
||||
counters.traffic_tx_packets.inc();
|
||||
}
|
||||
Ok(self.sink.send(msg).await?)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user