From cfec6dbb3c4933f8abffc92f97ab4c47b7b145fa Mon Sep 17 00:00:00 2001 From: Alexey <247128645+axkurcom@users.noreply.github.com> Date: Tue, 3 Mar 2026 03:38:06 +0300 Subject: [PATCH] ME Adaptive Floor pull-up Co-Authored-By: brekotis <93345790+brekotis@users.noreply.github.com> --- src/config/hot_reload.rs | 30 ++++++++++++++++++++- src/main.rs | 4 +++ src/metrics.rs | 58 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/config/hot_reload.rs b/src/config/hot_reload.rs index e16cff2..caec078 100644 --- a/src/config/hot_reload.rs +++ b/src/config/hot_reload.rs @@ -32,7 +32,7 @@ use notify::{EventKind, RecursiveMode, Watcher, recommended_watcher}; use tokio::sync::{mpsc, watch}; use tracing::{error, info, warn}; -use crate::config::{LogLevel, MeSocksKdfPolicy, MeTelemetryLevel}; +use crate::config::{LogLevel, MeFloorMode, MeSocksKdfPolicy, MeTelemetryLevel}; use super::load::ProxyConfig; // ── Hot fields ──────────────────────────────────────────────────────────────── @@ -58,6 +58,10 @@ pub struct HotFields { pub telemetry_user_enabled: bool, pub telemetry_me_level: MeTelemetryLevel, pub me_socks_kdf_policy: MeSocksKdfPolicy, + pub me_floor_mode: MeFloorMode, + pub me_adaptive_floor_idle_secs: u64, + pub me_adaptive_floor_min_writers_single_endpoint: u8, + pub me_adaptive_floor_recover_grace_secs: u64, pub me_route_backpressure_base_timeout_ms: u64, pub me_route_backpressure_high_timeout_ms: u64, pub me_route_backpressure_high_watermark_pct: u8, @@ -85,6 +89,14 @@ impl HotFields { telemetry_user_enabled: cfg.general.telemetry.user_enabled, telemetry_me_level: cfg.general.telemetry.me_level, me_socks_kdf_policy: cfg.general.me_socks_kdf_policy, + me_floor_mode: cfg.general.me_floor_mode, + me_adaptive_floor_idle_secs: cfg.general.me_adaptive_floor_idle_secs, + me_adaptive_floor_min_writers_single_endpoint: cfg + .general + .me_adaptive_floor_min_writers_single_endpoint, + me_adaptive_floor_recover_grace_secs: cfg + .general + .me_adaptive_floor_recover_grace_secs, me_route_backpressure_base_timeout_ms: cfg.general.me_route_backpressure_base_timeout_ms, me_route_backpressure_high_timeout_ms: cfg.general.me_route_backpressure_high_timeout_ms, me_route_backpressure_high_watermark_pct: cfg.general.me_route_backpressure_high_watermark_pct, @@ -309,6 +321,22 @@ fn log_changes( ); } + if old_hot.me_floor_mode != new_hot.me_floor_mode + || old_hot.me_adaptive_floor_idle_secs != new_hot.me_adaptive_floor_idle_secs + || old_hot.me_adaptive_floor_min_writers_single_endpoint + != new_hot.me_adaptive_floor_min_writers_single_endpoint + || old_hot.me_adaptive_floor_recover_grace_secs + != new_hot.me_adaptive_floor_recover_grace_secs + { + info!( + "config reload: me_floor: mode={:?} idle={}s min_single={} recover_grace={}s", + new_hot.me_floor_mode, + new_hot.me_adaptive_floor_idle_secs, + new_hot.me_adaptive_floor_min_writers_single_endpoint, + new_hot.me_adaptive_floor_recover_grace_secs, + ); + } + if old_hot.me_route_backpressure_base_timeout_ms != new_hot.me_route_backpressure_base_timeout_ms || old_hot.me_route_backpressure_high_timeout_ms diff --git a/src/main.rs b/src/main.rs index 4ff79fc..b890233 100644 --- a/src/main.rs +++ b/src/main.rs @@ -544,6 +544,10 @@ async fn main() -> std::result::Result<(), Box> { config.general.me_single_endpoint_outage_backoff_min_ms, config.general.me_single_endpoint_outage_backoff_max_ms, config.general.me_single_endpoint_shadow_rotate_every_secs, + config.general.me_floor_mode, + config.general.me_adaptive_floor_idle_secs, + config.general.me_adaptive_floor_min_writers_single_endpoint, + config.general.me_adaptive_floor_recover_grace_secs, config.general.hardswap, config.general.me_pool_drain_ttl_secs, config.general.effective_me_pool_force_close_secs(), diff --git a/src/metrics.rs b/src/metrics.rs index 4c03dc2..f8a6716 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -620,6 +620,64 @@ async fn render_metrics(stats: &Stats, config: &ProxyConfig, ip_tracker: &UserIp } ); + let _ = writeln!( + out, + "# HELP telemt_me_floor_mode Runtime ME writer floor policy mode" + ); + let _ = writeln!(out, "# TYPE telemt_me_floor_mode gauge"); + let floor_mode = config.general.me_floor_mode; + let _ = writeln!( + out, + "telemt_me_floor_mode{{mode=\"static\"}} {}", + if matches!(floor_mode, crate::config::MeFloorMode::Static) { + 1 + } else { + 0 + } + ); + let _ = writeln!( + out, + "telemt_me_floor_mode{{mode=\"adaptive\"}} {}", + if matches!(floor_mode, crate::config::MeFloorMode::Adaptive) { + 1 + } else { + 0 + } + ); + + let _ = writeln!( + out, + "# HELP telemt_me_floor_mode_switch_all_total Runtime ME floor mode switches" + ); + let _ = writeln!(out, "# TYPE telemt_me_floor_mode_switch_all_total counter"); + let _ = writeln!( + out, + "telemt_me_floor_mode_switch_all_total {}", + if me_allows_normal { + stats.get_me_floor_mode_switch_total() + } else { + 0 + } + ); + let _ = writeln!( + out, + "telemt_me_floor_mode_switch_total{{from=\"static\",to=\"adaptive\"}} {}", + if me_allows_normal { + stats.get_me_floor_mode_switch_static_to_adaptive_total() + } else { + 0 + } + ); + let _ = writeln!( + out, + "telemt_me_floor_mode_switch_total{{from=\"adaptive\",to=\"static\"}} {}", + if me_allows_normal { + stats.get_me_floor_mode_switch_adaptive_to_static_total() + } else { + 0 + } + ); + let _ = writeln!(out, "# HELP telemt_secure_padding_invalid_total Invalid secure frame lengths"); let _ = writeln!(out, "# TYPE telemt_secure_padding_invalid_total counter"); let _ = writeln!(