From 4a4f3e618783926b77a3656e3b09d1dbb4bcfc93 Mon Sep 17 00:00:00 2001 From: Ara Sadoyan Date: Fri, 4 Sep 2026 16:24:49 +0200 Subject: [PATCH] fixed closed #52 --- Cargo.lock | 102 ++++++++++++++++++++++++------------------- Cargo.toml | 20 ++++----- src/utils/metrics.rs | 97 +++++++++++++++++++++++++++++++++------- src/web/bgservice.rs | 2 + src/web/start.rs | 5 +-- 5 files changed, 153 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97ce8a5..38edab2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,7 +138,7 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "aralez" -version = "0.93.2" +version = "0.93.3" dependencies = [ "ahash", "arc-swap", @@ -183,7 +183,7 @@ dependencies = [ "subtle", "tokio", "tokio-native-tls", - "tower-http 0.7.0", + "tower-http 0.7.1", "urlencoding", "x509-parser", ] @@ -284,9 +284,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.91" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", @@ -307,9 +307,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.17.1" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -318,9 +318,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.42.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", @@ -1338,9 +1338,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -1353,9 +1353,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -1363,15 +1363,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -1380,38 +1380,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -1638,9 +1638,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", @@ -1684,9 +1684,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" dependencies = [ "atomic-waker", "bytes", @@ -2019,7 +2019,7 @@ dependencies = [ "js-sys", "p256", "p384", - "pem", + "pem 3.0.6", "rand 0.8.7", "rsa", "serde", @@ -2096,7 +2096,7 @@ dependencies = [ "jsonpath-rust", "k8s-openapi", "kube-core", - "pem", + "pem 3.0.6", "rustls", "rustls-platform-verifier", "secrecy", @@ -2239,9 +2239,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" dependencies = [ "serde_core", ] @@ -2373,9 +2373,9 @@ checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399" [[package]] name = "moka" -version = "0.12.15" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -2505,16 +2505,18 @@ dependencies = [ [[package]] name = "noyalib" -version = "0.0.18" +version = "0.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc67d13e91577493ff12d930fcdc92a342b46e2299210089d90d2caed837f60" +checksum = "190b855ac3a2a1ff710c203db23da6aec67f4317af6e226960d40f181ceeccac" dependencies = [ + "hashbrown 0.17.1", "indexmap 2.14.0", "itoa", + "libm", "memchr", "rustc-hash", "ryu", - "serde", + "serde_core", "serde_ignored", "smallvec", ] @@ -2760,6 +2762,16 @@ dependencies = [ "serde_core", ] +[[package]] +name = "pem" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d354a98a3d1251555de99e8fdd8afda05573c31b82f59063a7b0a29b5527f120" +dependencies = [ + "base64 0.23.1", + "serde_core", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3357,12 +3369,12 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rcgen" -version = "0.14.8" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f6d249aad744e274e682777a50283a225a32705394ee6d5fcc01efa25e4055" +checksum = "8774e05a7d0de114588e6a28fe7e71694b82614ed569d86d8b389dfbc98b8ad8" dependencies = [ "aws-lc-rs", - "pem", + "pem 4.0.0", "ring", "rustls-pki-types", "time", @@ -4356,9 +4368,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" +checksum = "08a05a66a4fdd61cbbe0a1d755ffe0ca6aba159dd4820936a0ff8a8278245b9c" dependencies = [ "bitflags 2.13.0", "bytes", diff --git a/Cargo.toml b/Cargo.toml index 70c5ac3..b3686d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aralez" -version = "0.93.2" +version = "0.93.3" edition = "2021" license = "Apache-2.0" description = "Reverse proxy built on top of Cloudflare's Pingora" @@ -23,12 +23,12 @@ pingora-http = "0.8.1" pingora-limits = "0.8.1" pingora-cache = "0.8.1" dashmap = "7.0.0-rc2" -async-trait = "0.1.91" -log = "0.4.33" +async-trait = "0.1.92" +log = "0.4.34" notify = "9.0.0-rc.4" axum = { version = "0.8.9" } serde = { version = "1.0.229", features = ["derive"] } -noyalib = { version = "0.0.18", features = ["compat-serde-yaml"] } +noyalib = { version = "0.0.32", features = ["compat-serde-yaml"] } rand = "0.10.2" base64 = "0.23.1" jsonwebtoken = { version = "11.0.0", default-features = false, features = ["use_pem", "rust_crypto"] } @@ -39,26 +39,26 @@ arc-swap = "1.9.2" prometheus = "0.14.0" x509-parser = "0.18.1" rustls-pemfile = "2.2.0" -tower-http = { version = "0.7.0", features = ["fs"] } +tower-http = { version = "0.7.1", features = ["fs"] } privdrop = "0.5.6" serde_json = "1.0.151" subtle = "2.6.1" -moka = { version = "0.12.15", features = ["sync"] } +moka = { version = "0.12.16", features = ["sync"] } ahash = "0.8.12" instant-acme = "0.8.5" -rcgen = "0.14.8" +rcgen = "0.14.10" log4rs = { version = "1.4.0", features = ["rolling_file_appender", "compound_policy", "size_trigger", "fixed_window_roller", "gzip"] } mimalloc = { version = "0.1.52", default-features = false } signal-hook = "0.4.4" sd-notify = "0.5.0" libc = "0.2.186" tokio-native-tls = "0.3.1" -hyper = "1.11.0" +hyper = "1.11.1" hyper-util = "0.1.20" -http-body-util = "0.1.4" +http-body-util = "0.1.5" bytes = "1.12.1" rustls = { version = "0.23", default-features = false, features = ["ring"] } kube = { version = "4.2.0", features = ["runtime", "client", "derive"] } k8s-openapi = { version = "0.28.0", features = ["v1_32"] } -futures = "0.3" +futures = "0.3.34" diff --git a/src/utils/metrics.rs b/src/utils/metrics.rs index 377071f..c6bf9ac 100644 --- a/src/utils/metrics.rs +++ b/src/utils/metrics.rs @@ -47,28 +47,83 @@ pub static REQUESTS_BY_UPSTREAM: LazyLock = pub static REQUESTS_BY_VERSION: LazyLock = LazyLock::new(|| register_int_counter_vec!("aralez_requests_by_version_total", "Number of requests by HTTP versions", &["version"]).unwrap()); +pub static HTTP_11_COUNT: LazyLock = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/1.1"])); +pub static HTTP_20_COUNT: LazyLock = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/2.0"])); +pub static HTTP_30_COUNT: LazyLock = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/3.0"])); +pub static HTTP_10_COUNT: LazyLock = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/1.0"])); +pub static HTTP_UNK_COUNT: LazyLock = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["Unknown"])); + +pub static METHOD_GET: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["GET"])); +pub static METHOD_POST: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["POST"])); +pub static METHOD_PUT: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["PUT"])); +pub static METHOD_DELETE: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["DELETE"])); +pub static METHOD_HEAD: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["HEAD"])); +pub static METHOD_OPTIONS: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["OPTIONS"])); +pub static METHOD_PATCH: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["PATCH"])); +pub static METHOD_OTHER: LazyLock = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["OTHER"])); + +pub static STATUS_100: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["100"])); +pub static STATUS_101: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["101"])); +pub static STATUS_200: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["200"])); +pub static STATUS_204: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["204"])); +pub static STATUS_301: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["301"])); +pub static STATUS_302: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["302"])); +pub static STATUS_304: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["304"])); +pub static STATUS_400: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["400"])); +pub static STATUS_403: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["403"])); +pub static STATUS_404: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["404"])); +pub static STATUS_500: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["500"])); +pub static STATUS_501: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["501"])); +pub static STATUS_502: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["502"])); +pub static STATUS_503: LazyLock = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["503"])); pub fn calc_metrics(metric_types: &MetricTypes) { REQUEST_COUNT.inc(); - let version_str = match metric_types.version { - Version::HTTP_11 => "HTTP/1.1", - Version::HTTP_2 => "HTTP/2.0", - Version::HTTP_3 => "HTTP/3.0", - Version::HTTP_10 => "HTTP/1.0", - _ => "Unknown", + match metric_types.version { + Version::HTTP_11 => HTTP_11_COUNT.inc(), + Version::HTTP_2 => HTTP_20_COUNT.inc(), + Version::HTTP_3 => HTTP_30_COUNT.inc(), + Version::HTTP_10 => HTTP_10_COUNT.inc(), + _ => HTTP_UNK_COUNT.inc(), }; - REQUESTS_BY_VERSION.with_label_values(&[version_str]).inc(); - RESPONSE_CODES.with_label_values(&[metric_types.code.unwrap_or(StatusCode::GONE).as_str()]).inc(); - REQUESTS_BY_METHOD.with_label_values(&[metric_types.method.as_str()]).inc(); + match metric_types.method.as_str() { + "GET" => METHOD_GET.inc(), + "POST" => METHOD_POST.inc(), + "PUT" => METHOD_PUT.inc(), + "DELETE" => METHOD_DELETE.inc(), + "HEAD" => METHOD_HEAD.inc(), + "OPTIONS" => METHOD_OPTIONS.inc(), + "PATCH" => METHOD_PATCH.inc(), + _ => METHOD_OTHER.inc(), + } + let code = metric_types.code.unwrap_or(StatusCode::GONE); + match code.as_u16() { + 100 => STATUS_100.inc(), + 101 => STATUS_101.inc(), + 200 => STATUS_200.inc(), + 204 => STATUS_204.inc(), + 301 => STATUS_301.inc(), + 302 => STATUS_302.inc(), + 304 => STATUS_304.inc(), + 400 => STATUS_400.inc(), + 403 => STATUS_403.inc(), + 404 => STATUS_404.inc(), + 500 => STATUS_500.inc(), + 501 => STATUS_501.inc(), + 502 => STATUS_502.inc(), + 503 => STATUS_503.inc(), + _ => RESPONSE_CODES.with_label_values(&[code.as_str()]).inc(), // Fallback for rare status codes + } + REQUESTS_BY_UPSTREAM.with_label_values(&[metric_types.upstream.as_ref()]).inc(); RESPONSE_LATENCY.observe(metric_types.latency.as_secs_f64()); - if let Some(eviction) = EVICTION.get() { - CACHE_SIZE_BYTES.set(eviction.total_size() as i64); - CACHE_ITEMS.set(eviction.total_items() as i64); - CACHE_EVICTED_BYTES.set(eviction.evicted_size() as i64); - CACHE_EVICTED_ITEMS.set(eviction.evicted_items() as i64); - } + // if let Some(eviction) = EVICTION.get() { + // CACHE_SIZE_BYTES.set(eviction.total_size() as i64); + // CACHE_ITEMS.set(eviction.total_items() as i64); + // CACHE_EVICTED_BYTES.set(eviction.evicted_size() as i64); + // CACHE_EVICTED_ITEMS.set(eviction.evicted_items() as i64); + // } } pub(crate) fn get_memory_usage() -> usize { @@ -87,3 +142,15 @@ pub(crate) fn get_memory_usage() -> usize { pub fn get_open_files() -> usize { std::fs::read_dir("/proc/self/fd").map(|dir| dir.count()).unwrap_or(0) } + +pub async fn calc_cache_metrics() { + loop { + if let Some(eviction) = EVICTION.get() { + CACHE_SIZE_BYTES.set(eviction.total_size() as i64); + CACHE_ITEMS.set(eviction.total_items() as i64); + CACHE_EVICTED_BYTES.set(eviction.evicted_size() as i64); + CACHE_EVICTED_ITEMS.set(eviction.evicted_items() as i64); + } + tokio::time::sleep(std::time::Duration::from_secs(5)).await; + } +} diff --git a/src/web/bgservice.rs b/src/web/bgservice.rs index 6fefa79..f328417 100644 --- a/src/web/bgservice.rs +++ b/src/web/bgservice.rs @@ -1,5 +1,6 @@ use crate::tls::acme::order::refresh_order; use crate::utils::discovery::{APIUpstreamProvider, ConsulProvider, Discovery, FromFileProvider, KubernetesProvider}; +use crate::utils::metrics::calc_cache_metrics; use crate::utils::parceyaml::load_configuration; use crate::utils::structs::Configuration; use crate::utils::tools::*; @@ -76,6 +77,7 @@ impl BackgroundService for LB { drop(tokio::spawn(async move { healthcheck::hc2(uu, ff, im, (&*hc_method.to_string(), hc_interval.to_string().parse().unwrap())).await })); + drop(tokio::spawn(async move { calc_cache_metrics().await })); drop(tokio::spawn(async move { refresh_order(certdir, confdir).await })); init_logging(self.config.access_log.clone()); loop { diff --git a/src/web/start.rs b/src/web/start.rs index 2728a67..65a39ee 100644 --- a/src/web/start.rs +++ b/src/web/start.rs @@ -1,4 +1,3 @@ -// use rustls::crypto::ring::default_provider; use crate::tls::grades; use crate::tls::load; use crate::tls::load::CertificateConfig; @@ -18,6 +17,7 @@ use pingora_core::prelude::{background_service, Opt}; use pingora_core::protocols::TcpKeepalive; use pingora_core::server::Server; use privdrop::reexports::libc::SIGQUIT; +use rustls::crypto::ring::default_provider; use sd_notify::NotifyState; use signal_hook::{ consts::{SIGINT, SIGTERM}, @@ -27,9 +27,8 @@ use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::Arc; use std::time::Duration; use std::{fs, thread}; - pub fn run() { - // default_provider().install_default().expect("Failed to install rustls crypto provider"); + default_provider().install_default().expect("Failed to install RusTLS crypto provider"); let parameters = Opt::parse_args(); let file = parameters.conf.clone().unwrap(); let maincfg = crate::utils::parceyaml::parce_main_config(file.as_str());