feat(observability): Pass metrics sender to rate controller and reflector selector

This commit is contained in:
Nils Andreas Svee committed 2026-04-13 15:01:46 +07:00
1 parent 2c1e7c0483
commit e5ba021a96
2 files changed
+26 -11

No files matched your search

+21 -9
View File
@@ -1,3 +1,4 @@
use crate::metrics::Metric;
use crate::netlink::{Netlink, NetlinkError, Qdisc}; use crate::netlink::{Netlink, NetlinkError, Qdisc};
use crate::time::Time; use crate::time::Time;
use crate::util::{MutexExt, RwLockExt}; use crate::util::{MutexExt, RwLockExt};
@@ -8,7 +9,7 @@ use std::collections::HashMap;
use std::fs::File; use std::fs::File;
use std::io::Write; use std::io::Write;
use std::net::IpAddr; use std::net::IpAddr;
use std::sync::mpsc::Sender; use std::sync::mpsc::{Sender, SyncSender};
use std::sync::{Arc, Mutex, RwLock}; use std::sync::{Arc, Mutex, RwLock};
use std::thread::sleep; use std::thread::sleep;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
@@ -108,6 +109,7 @@ pub struct Ratecontroller {
state_dl: State, state_dl: State,
state_ul: State, state_ul: State,
up_direction: StatsDirection, up_direction: StatsDirection,
metrics_sender: SyncSender<Metric>,
} }
impl Ratecontroller { impl Ratecontroller {
@@ -151,9 +153,7 @@ impl Ratecontroller {
/ dur.as_secs_f64(); / dur.as_secs_f64();
state.load = state.utilisation / state.current_rate; state.load = state.utilisation / state.current_rate;
if state.delta_stat < delay_ms if state.delta_stat < delay_ms && state.load > self.config.high_load_level {
&& state.load > self.config.high_load_level
{
state.safe_rates[state.nrate] = (state.current_rate * state.load).floor(); state.safe_rates[state.nrate] = (state.current_rate * state.load).floor();
let max_rate = state let max_rate = state
.safe_rates .safe_rates
@@ -168,10 +168,12 @@ impl Ratecontroller {
} }
if state.delta_stat > delay_ms { if state.delta_stat > delay_ms {
match state.safe_rates.get(fastrand::usize(..state.safe_rates.len())) { match state
.safe_rates
.get(fastrand::usize(..state.safe_rates.len()))
{
Some(rnd_rate) => { Some(rnd_rate) => {
state.next_rate = state.next_rate = rnd_rate.min(0.9 * state.current_rate * state.load);
rnd_rate.min(0.9 * state.current_rate * state.load);
} }
None => { None => {
state.next_rate = 0.9 * state.current_rate * state.load; state.next_rate = 0.9 * state.current_rate * state.load;
@@ -246,6 +248,7 @@ impl Ratecontroller {
reselect_trigger: Sender<bool>, reselect_trigger: Sender<bool>,
down_direction: StatsDirection, down_direction: StatsDirection,
up_direction: StatsDirection, up_direction: StatsDirection,
metrics_sender: SyncSender<Metric>,
) -> anyhow::Result<Self> { ) -> anyhow::Result<Self> {
let dl_qdisc = Netlink::qdisc_from_ifname(config.download_interface.as_str())?; let dl_qdisc = Netlink::qdisc_from_ifname(config.download_interface.as_str())?;
let dl_safe_rates = let dl_safe_rates =
@@ -266,6 +269,7 @@ impl Ratecontroller {
state_dl: State::new(dl_qdisc, cur_rx, dl_safe_rates), state_dl: State::new(dl_qdisc, cur_rx, dl_safe_rates),
state_ul: State::new(ul_qdisc, cur_tx, ul_safe_rates), state_ul: State::new(ul_qdisc, cur_tx, ul_safe_rates),
up_direction, up_direction,
metrics_sender,
}) })
} }
@@ -374,11 +378,19 @@ impl Ratecontroller {
} }
if self.state_dl.next_rate != self.state_dl.current_rate { if self.state_dl.next_rate != self.state_dl.current_rate {
Netlink::set_qdisc_rate(self.state_dl.qdisc, self.state_dl.next_rate as u64, self.config.dry_run)?; Netlink::set_qdisc_rate(
self.state_dl.qdisc,
self.state_dl.next_rate as u64,
self.config.dry_run,
)?;
} }
if self.state_ul.next_rate != self.state_ul.current_rate { if self.state_ul.next_rate != self.state_ul.current_rate {
Netlink::set_qdisc_rate(self.state_ul.qdisc, self.state_ul.next_rate as u64, self.config.dry_run)?; Netlink::set_qdisc_rate(
self.state_ul.qdisc,
self.state_ul.next_rate as u64,
self.config.dry_run,
)?;
} }
self.state_dl.current_rate = self.state_dl.next_rate; self.state_dl.current_rate = self.state_dl.next_rate;
+5 -2
View File
@@ -1,9 +1,10 @@
use crate::metrics::Metric;
use crate::util::{MutexExt, RwLockExt}; use crate::util::{MutexExt, RwLockExt};
use crate::{Config, ReflectorStats}; use crate::{Config, ReflectorStats};
use log::{debug, info}; use log::{debug, info};
use std::collections::HashMap; use std::collections::HashMap;
use std::net::IpAddr; use std::net::IpAddr;
use std::sync::mpsc::Receiver; use std::sync::mpsc::{Receiver, SyncSender};
use std::sync::{Arc, Mutex, RwLock}; use std::sync::{Arc, Mutex, RwLock};
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
@@ -14,6 +15,7 @@ pub struct ReflectorSelector {
pub reflector_peers_lock: Arc<RwLock<Vec<IpAddr>>>, pub reflector_peers_lock: Arc<RwLock<Vec<IpAddr>>>,
pub reflector_pool: Vec<IpAddr>, pub reflector_pool: Vec<IpAddr>,
pub trigger_channel: Receiver<bool>, pub trigger_channel: Receiver<bool>,
pub metrics_sender: SyncSender<Metric>,
} }
impl ReflectorSelector { impl ReflectorSelector {
@@ -54,7 +56,8 @@ impl ReflectorSelector {
} }
for _ in 0..20 { for _ in 0..20 {
let next_candidate = &self.reflector_pool[fastrand::usize(..self.reflector_pool.len())]; let next_candidate =
&self.reflector_pool[fastrand::usize(..self.reflector_pool.len())];
if next_peers.contains(next_candidate) { if next_peers.contains(next_candidate) {
continue; continue;
} }