From e22b24684f28a8ad4d4690b8e1d2f20c8bcf28c6 Mon Sep 17 00:00:00 2001 From: houseme Date: Fri, 24 Oct 2025 00:16:17 +0800 Subject: [PATCH] chore: bump dependencies, add metrics support, remove DNS resolver (#699) * upgrade version * add metrics * remove dns resolver * add metrics counter for create bucket * fix * fix * fix --- Cargo.lock | 563 ++++++++----------- Cargo.toml | 26 +- crates/ecstore/src/config/mod.rs | 1 - crates/iam/Cargo.toml | 1 - crates/obs/Cargo.toml | 3 +- crates/obs/src/telemetry.rs | 10 +- crates/rio/Cargo.toml | 1 - crates/utils/Cargo.toml | 4 +- crates/utils/src/dns_resolver.rs | 924 +++++++++++++++---------------- crates/utils/src/lib.rs | 2 - crates/utils/src/net.rs | 19 +- rustfs/Cargo.toml | 1 + rustfs/src/main.rs | 10 - rustfs/src/server/http.rs | 8 +- rustfs/src/storage/ecfs.rs | 3 + 15 files changed, 726 insertions(+), 850 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c50b786..adbab14c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -479,7 +479,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -501,7 +501,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -512,7 +512,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -538,7 +538,7 @@ checksum = "99e1aca718ea7b89985790c94aad72d77533063fe00bc497bb79a7c2dae6a661" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -850,7 +850,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -1065,7 +1065,7 @@ dependencies = [ "hyper 1.7.0", "hyper-util", "pin-project-lite", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pemfile 2.2.0", "rustls-pki-types", "tokio", @@ -1130,9 +1130,9 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bigdecimal" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a22f228ab7a1b23027ccc6c350b72868017af7ea8356fbdf19f8d991c690013" +checksum = "560f42649de9fa436b73517378a147ec21f6c997a546581df4b4b31677828934" dependencies = [ "autocfg", "libm", @@ -1147,7 +1147,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1158,7 +1158,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1169,9 +1169,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "blake2" @@ -1501,9 +1501,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.49" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4512b90fa68d3a9932cea5184017c5d200f5921df706d45e853537dea51508f" +checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" dependencies = [ "clap_builder", "clap_derive", @@ -1511,9 +1511,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.49" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0025e98baa12e766c67ba13ff4695a887a1eba19569aad00a472546795bd6730" +checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" dependencies = [ "anstream", "anstyle", @@ -1530,7 +1530,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1623,7 +1623,7 @@ checksum = "a08a8aee16926ee1c4ad18868b8c3dfe5106359053f91e035861ec2a17116988" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1793,12 +1793,6 @@ dependencies = [ "itertools 0.13.0", ] -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1894,21 +1888,21 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -1946,7 +1940,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2004,7 +1998,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2018,7 +2012,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2040,7 +2034,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2051,7 +2045,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2068,12 +2062,6 @@ dependencies = [ "parking_lot_core", ] -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - [[package]] name = "datafusion" version = "50.2.0" @@ -2532,7 +2520,7 @@ checksum = "c4868fe261ba01e462033eff141e90453b7630722cad6420fddd81ebb786f6e2" dependencies = [ "datafusion-expr", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2771,7 +2759,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2813,7 +2801,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2833,7 +2821,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core 0.20.2", - "syn 2.0.106", + "syn 2.0.108", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "unicode-xid", ] [[package]] @@ -2895,7 +2904,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3057,7 +3066,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3078,7 +3087,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3098,7 +3107,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3223,7 +3232,7 @@ version = "25.9.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09b6620799e7340ebd9968d2e0708eb82cf1971e9a16821e2091b6d6e475eed5" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "rustc_version", ] @@ -3379,7 +3388,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3606,57 +3615,6 @@ dependencies = [ "vsimd", ] -[[package]] -name = "hickory-proto" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" -dependencies = [ - "async-trait", - "bytes", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.9.2", - "ring", - "rustls 0.23.32", - "thiserror 2.0.17", - "tinyvec", - "tokio", - "tokio-rustls 0.26.4", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "moka", - "once_cell", - "parking_lot", - "rand 0.9.2", - "resolv-conf", - "rustls 0.23.32", - "smallvec", - "thiserror 2.0.17", - "tokio", - "tokio-rustls 0.26.4", - "tracing", -] - [[package]] name = "highway" version = "1.3.0" @@ -3855,7 +3813,7 @@ dependencies = [ "hyper 1.7.0", "hyper-util", "log", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -4042,9 +4000,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", @@ -4074,7 +4032,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "inotify-sys", "libc", ] @@ -4103,18 +4061,6 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" -[[package]] -name = "ipconfig" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" -dependencies = [ - "socket2 0.5.10", - "widestring", - "windows-sys 0.48.0", - "winreg", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -4159,9 +4105,9 @@ checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -4209,9 +4155,9 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1417155a38e99d7704ddb3ea7445fe57fdbd5d756d727740a9ed8b9ebaed6e1" +checksum = "3d119c6924272d16f0ab9ce41f7aa0bfef9340c00b0bb7ca3dd3b263d4a9150b" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -4360,7 +4306,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "redox_syscall 0.5.18", ] @@ -4544,9 +4490,9 @@ checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", ] @@ -4560,6 +4506,28 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metrics" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dea7ac8057892855ec285c440160265225438c3c45072613c25a4b26e98ef5" +dependencies = [ + "ahash", + "portable-atomic", +] + +[[package]] +name = "metrics-exporter-opentelemetry" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85831c590c74bde49aac410386630e60f216a7d9473726708da160c5303ef803" +dependencies = [ + "derive_more", + "metrics", + "opentelemetry 0.30.0", + "opentelemetry_sdk 0.30.0", +] + [[package]] name = "mimalloc" version = "0.1.48" @@ -4603,14 +4571,14 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4692,7 +4660,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -4705,7 +4673,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -4736,7 +4704,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "fsevent-sys", "inotify", "kqueue", @@ -4922,7 +4890,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libloading", "nvml-wrapper-sys", "static_assertions", @@ -4945,7 +4913,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -4996,16 +4964,12 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" -dependencies = [ - "critical-section", - "portable-atomic", -] [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "oorandom" @@ -5025,6 +4989,20 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "opentelemetry" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.17", + "tracing", +] + [[package]] name = "opentelemetry" version = "0.31.0" @@ -5045,7 +5023,7 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6a1ac5ca3accf562b8c306fa8483c85f4390f768185ab775f242f7fe8fdcc2" dependencies = [ - "opentelemetry", + "opentelemetry 0.31.0", "tracing", "tracing-core", "tracing-log", @@ -5062,7 +5040,7 @@ dependencies = [ "async-trait", "bytes", "http 1.3.1", - "opentelemetry", + "opentelemetry 0.31.0", ] [[package]] @@ -5072,10 +5050,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" dependencies = [ "http 1.3.1", - "opentelemetry", + "opentelemetry 0.31.0", "opentelemetry-http", "opentelemetry-proto", - "opentelemetry_sdk", + "opentelemetry_sdk 0.31.0", "prost", "thiserror 2.0.17", "tokio", @@ -5089,8 +5067,8 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" dependencies = [ - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.31.0", + "opentelemetry_sdk 0.31.0", "prost", "tonic", "tonic-prost", @@ -5109,8 +5087,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc8887887e169414f637b18751487cce4e095be787d23fad13c454e2fb1b3811" dependencies = [ "chrono", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.31.0", + "opentelemetry_sdk 0.31.0", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry 0.30.0", + "thiserror 2.0.17", ] [[package]] @@ -5122,7 +5113,7 @@ dependencies = [ "futures-channel", "futures-executor", "futures-util", - "opentelemetry", + "opentelemetry 0.31.0", "percent-encoding", "rand 0.9.2", "thiserror 2.0.17", @@ -5385,7 +5376,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5565,7 +5556,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5579,9 +5570,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "8e0f6df8eaa422d97d72edcd152e1451618fed47fabbdbd5a8864167b1d4aff7" dependencies = [ "unicode-ident", ] @@ -5614,7 +5605,7 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn 2.0.106", + "syn 2.0.108", "tempfile", ] @@ -5628,7 +5619,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5706,7 +5697,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "memchr", "unicase", ] @@ -5762,7 +5753,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.32", + "rustls 0.23.34", "socket2 0.6.1", "thiserror 2.0.17", "tokio", @@ -5782,7 +5773,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "slab", "thiserror 2.0.17", @@ -5922,7 +5913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5940,7 +5931,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -5983,7 +5974,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -6046,7 +6037,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "serde", "serde_json", @@ -6066,12 +6057,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "resolv-conf" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" - [[package]] name = "rfc6979" version = "0.3.1" @@ -6118,9 +6103,9 @@ dependencies = [ [[package]] name = "rmcp" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f35acda8f89fca5fd8c96cae3c6d5b4c38ea0072df4c8030915f3b5ff469c1c" +checksum = "1fdad1258f7259fdc0f2dfc266939c82c3b5d1fd72bcde274d600cdc27e60243" dependencies = [ "base64 0.22.1", "chrono", @@ -6139,15 +6124,15 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9f1d5220aaa23b79c3d02e18f7a554403b3ccea544bbb6c69d6bcb3e854a274" +checksum = "ede0589a208cc7ce81d1be68aa7e74b917fcd03c81528408bab0457e187dcd9b" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", "serde_json", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -6215,9 +6200,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.7.2" +version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" +checksum = "fb44e1917075637ee8c7bcb865cf8830e3a92b5b1189e44e3a0ab5a0d5be314b" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -6226,23 +6211,23 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.7.2" +version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" +checksum = "382499b49db77a7c19abd2a574f85ada7e9dbe125d5d1160fa5cad7c4cf71fc9" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.106", + "syn 2.0.108", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.7.2" +version = "8.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" +checksum = "21fcbee55c2458836bcdbfffb6ec9ba74bbc23ca7aa6816015a3dd2c4d8fc185" dependencies = [ "sha2 0.10.9", "walkdir", @@ -6297,9 +6282,10 @@ dependencies = [ "libsystemd", "matchit", "md5", + "metrics", "mimalloc", "mime_guess", - "opentelemetry", + "opentelemetry 0.31.0", "pin-project-lite", "pprof", "reqwest", @@ -6326,7 +6312,7 @@ dependencies = [ "rustfs-targets", "rustfs-utils", "rustfs-zip", - "rustls 0.23.32", + "rustls 0.23.34", "s3s", "serde", "serde_json", @@ -6520,7 +6506,7 @@ dependencies = [ "rustfs-signer", "rustfs-utils", "rustfs-workers", - "rustls 0.23.32", + "rustls 0.23.34", "s3s", "serde", "serde_json", @@ -6577,7 +6563,6 @@ dependencies = [ "futures", "jsonwebtoken", "rand 0.9.2", - "rustfs-config", "rustfs-crypto", "rustfs-ecstore", "rustfs-madmin", @@ -6707,14 +6692,16 @@ name = "rustfs-obs" version = "0.0.5" dependencies = [ "flexi_logger", + "metrics", + "metrics-exporter-opentelemetry", "nu-ansi-term", "nvml-wrapper", - "opentelemetry", + "opentelemetry 0.31.0", "opentelemetry-appender-tracing", "opentelemetry-otlp", "opentelemetry-semantic-conventions", "opentelemetry-stdout", - "opentelemetry_sdk", + "opentelemetry_sdk 0.31.0", "rustfs-config", "rustfs-utils", "serde", @@ -6723,7 +6710,6 @@ dependencies = [ "thiserror 2.0.17", "tokio", "tracing", - "tracing-core", "tracing-error", "tracing-opentelemetry", "tracing-subscriber", @@ -6771,7 +6757,6 @@ version = "0.0.5" dependencies = [ "aes-gcm", "base64 0.22.1", - "base64-simd", "bytes", "crc32c", "crc32fast", @@ -6886,7 +6871,6 @@ dependencies = [ "futures", "hashbrown 0.16.0", "hex-simd", - "hickory-resolver", "highway", "hmac 0.12.1", "http 1.3.1", @@ -6895,13 +6879,12 @@ dependencies = [ "local-ip-address", "lz4", "md-5", - "moka", "netif", "nix 0.30.1", "rand 0.9.2", "regex", "rustfs-config", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pemfile 2.2.0", "rustls-pki-types", "s3s", @@ -6979,7 +6962,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6992,7 +6975,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.11.0", @@ -7013,9 +6996,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ "aws-lc-rs", "log", @@ -7226,7 +7209,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7285,7 +7268,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -7298,7 +7281,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -7380,7 +7363,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7391,7 +7374,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7470,7 +7453,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7659,7 +7642,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7745,7 +7728,7 @@ checksum = "da5fc6819faabb412da764b99d3b713bb55083c11e7e0c00144d386cd6a1939c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7839,7 +7822,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7851,7 +7834,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7862,15 +7845,15 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sval" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d94c4464e595f0284970fd9c7e9013804d035d4a61ab74b113242c874c05814d" +checksum = "502b8906c4736190684646827fbab1e954357dfe541013bbd7994d033d53a1ca" [[package]] name = "sval_buffer" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f46e34b20a39e6a2bf02b926983149b3af6609fd1ee8a6e63f6f340f3e2164" +checksum = "c4b854348b15b6c441bdd27ce9053569b016a0723eab2d015b1fd8e6abe4f708" dependencies = [ "sval", "sval_ref", @@ -7878,18 +7861,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d0970e53c92ab5381d3b2db1828da8af945954d4234225f6dd9c3afbcef3f5" +checksum = "a0bd9e8b74410ddad37c6962587c5f9801a2caadba9e11f3f916ee3f31ae4a1f" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e5e6e1613e1e7fc2e1a9fdd709622e54c122ceb067a60d170d75efd491a839" +checksum = "6fe17b8deb33a9441280b4266c2d257e166bafbaea6e66b4b34ca139c91766d9" dependencies = [ "itoa", "ryu", @@ -7898,9 +7881,9 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aec382f7bfa6e367b23c9611f129b94eb7daaf3d8fae45a8d0a0211eb4d4c8e6" +checksum = "854addb048a5bafb1f496c98e0ab5b9b581c3843f03ca07c034ae110d3b7c623" dependencies = [ "itoa", "ryu", @@ -7909,9 +7892,9 @@ dependencies = [ [[package]] name = "sval_nested" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3049d0f99ce6297f8f7d9953b35a0103b7584d8f638de40e64edb7105fa578ae" +checksum = "96cf068f482108ff44ae8013477cb047a1665d5f1a635ad7cf79582c1845dce9" dependencies = [ "sval", "sval_buffer", @@ -7920,18 +7903,18 @@ dependencies = [ [[package]] name = "sval_ref" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88913e77506085c0a8bf6912bb6558591a960faf5317df6c1d9b227224ca6e1" +checksum = "ed02126365ffe5ab8faa0abd9be54fbe68d03d607cd623725b0a71541f8aaa6f" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f579fd7254f4be6cd7b450034f856b78523404655848789c451bacc6aa8b387d" +checksum = "a263383c6aa2076c4ef6011d3bae1b356edf6ea2613e3d8e8ebaa7b57dd707d5" dependencies = [ "serde_core", "sval", @@ -7974,9 +7957,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -8012,7 +7995,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8021,7 +8004,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cca424247104946a59dacd27eaad296223b7feec3d168a6dd04585183091eb0b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "enum-as-inner", "libc", @@ -8049,7 +8032,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -8110,7 +8093,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8121,7 +8104,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "test-case-core", ] @@ -8151,7 +8134,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8162,7 +8145,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8307,7 +8290,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8326,7 +8309,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.34", "tokio", ] @@ -8463,7 +8446,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8488,7 +8471,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.106", + "syn 2.0.108", "tempfile", "tonic-build", ] @@ -8519,7 +8502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-core", "futures-util", @@ -8568,7 +8551,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8609,8 +8592,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6e5658463dd88089aba75c7791e1d3120633b1bfde22478b28f625a9bb1b8e" dependencies = [ "js-sys", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.31.0", + "opentelemetry_sdk 0.31.0", "rustversion", "smallvec", "thiserror 2.0.17", @@ -8720,9 +8703,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-segmentation" @@ -8810,7 +8793,7 @@ checksum = "d9384a660318abfbd7f8932c34d67e4d1ec511095f95972ddc01e19d7ba8413f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8944,7 +8927,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "wasm-bindgen-shared", ] @@ -8979,7 +8962,7 @@ checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9047,12 +9030,6 @@ dependencies = [ "rustix 0.38.44", ] -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - [[package]] name = "wildmatch" version = "2.5.0" @@ -9160,7 +9137,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -9171,7 +9148,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -9243,15 +9220,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -9288,21 +9256,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -9345,12 +9298,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -9363,12 +9310,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -9381,12 +9322,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -9411,12 +9346,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -9429,12 +9358,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -9447,12 +9370,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -9465,12 +9382,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -9492,16 +9403,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen" version = "0.46.0" @@ -9517,7 +9418,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -9583,7 +9484,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure 0.13.2", ] @@ -9604,7 +9505,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -9624,7 +9525,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure 0.13.2", ] @@ -9645,7 +9546,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -9678,7 +9579,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 661c1c55..08bbe44f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -118,7 +118,7 @@ convert_case = "0.8.0" crc-fast = "1.3.0" chacha20poly1305 = { version = "0.10.1" } chrono = { version = "0.4.42", features = ["serde"] } -clap = { version = "4.5.49", features = ["derive", "env"] } +clap = { version = "4.5.50", features = ["derive", "env"] } const-str = { version = "0.7.0", features = ["std", "proc"] } crc32fast = "1.5.0" crc32c = "0.6.8" @@ -139,7 +139,6 @@ glob = "0.3.3" hashbrown = { version = "0.16.0", features = ["serde", "rayon"] } hex-simd = "0.8.0" highway = { version = "1.3.0" } -hickory-resolver = { version = "0.25.2", features = ["tls-ring"] } hmac = "0.12.1" hyper = "1.7.0" hyper-util = { version = "0.1.17", features = [ @@ -152,7 +151,7 @@ http = "1.3.1" http-body = "1.0.1" humantime = "2.3.0" ipnetwork = { version = "0.21.1", features = ["serde"] } -jsonwebtoken = { version = "10.0.0", features = ["rust_crypto"] } +jsonwebtoken = { version = "10.1.0", features = ["rust_crypto"] } lazy_static = "1.5.0" libc = "0.2.177" libsystemd = { version = "0.7.2" } @@ -161,6 +160,8 @@ lz4 = "1.28.1" matchit = "0.8.4" md-5 = "0.10.6" md5 = "0.8.0" +metrics = "0.24.2" +metrics-exporter-opentelemetry = "0.1.2" mime_guess = "2.0.5" moka = { version = "0.12.11", features = ["future"] } netif = "0.1.6" @@ -206,14 +207,14 @@ reqwest = { version = "0.12.24", default-features = false, features = [ "json", "blocking", ] } -rmcp = { version = "0.8.1" } +rmcp = { version = "0.8.3" } rmp = { version = "0.8.14" } rmp-serde = { version = "1.3.0" } rsa = { version = "0.9.8" } rumqttc = { version = "0.25.0" } -rust-embed = { version = "8.7.2" } +rust-embed = { version = "8.8.0" } rustc-hash = { version = "2.1.1" } -rustls = { version = "0.23.32", features = ["ring", "logging", "std", "tls12"], default-features = false } +rustls = { version = "0.23.34", features = ["ring", "logging", "std", "tls12"], default-features = false } rustls-pki-types = "1.12.0" rustls-pemfile = "2.2.0" s3s = { version = "0.12.0-rc.3", features = ["minio"] } @@ -258,7 +259,6 @@ tonic-prost-build = { version = "0.14.2" } tower = { version = "0.5.2", features = ["timeout"] } tower-http = { version = "0.6.6", features = ["cors"] } tracing = { version = "0.1.41" } -tracing-core = "0.1.34" tracing-error = "0.2.1" tracing-opentelemetry = "0.32.0" tracing-subscriber = { version = "0.3.20", features = ["env-filter", "time"] } @@ -281,17 +281,7 @@ zstd = "0.13.3" [workspace.metadata.cargo-shear] -ignored = ["rustfs", "rust-i18n", "rustfs-mcp", "tokio-test", "rustfs-audit"] - -[profile.wasm-dev] -inherits = "dev" -opt-level = 1 - -[profile.server-dev] -inherits = "dev" - -[profile.android-dev] -inherits = "dev" +ignored = ["rustfs", "rustfs-mcp", "tokio-test"] [profile.release] opt-level = 3 diff --git a/crates/ecstore/src/config/mod.rs b/crates/ecstore/src/config/mod.rs index ae7cffe7..33bc76f4 100644 --- a/crates/ecstore/src/config/mod.rs +++ b/crates/ecstore/src/config/mod.rs @@ -40,7 +40,6 @@ pub const ENV_ACCESS_KEY: &str = "RUSTFS_ACCESS_KEY"; pub const ENV_SECRET_KEY: &str = "RUSTFS_SECRET_KEY"; pub const ENV_ROOT_USER: &str = "RUSTFS_ROOT_USER"; pub const ENV_ROOT_PASSWORD: &str = "RUSTFS_ROOT_PASSWORD"; - pub static RUSTFS_CONFIG_PREFIX: &str = "config"; pub struct ConfigSys {} diff --git a/crates/iam/Cargo.toml b/crates/iam/Cargo.toml index 15e3c0e2..e119fe34 100644 --- a/crates/iam/Cargo.toml +++ b/crates/iam/Cargo.toml @@ -34,7 +34,6 @@ time = { workspace = true, features = ["serde-human-readable"] } serde = { workspace = true, features = ["derive", "rc"] } rustfs-ecstore = { workspace = true } rustfs-policy.workspace = true -rustfs-config.workspace = true serde_json.workspace = true async-trait.workspace = true thiserror.workspace = true diff --git a/crates/obs/Cargo.toml b/crates/obs/Cargo.toml index 5527bd93..a181b37b 100644 --- a/crates/obs/Cargo.toml +++ b/crates/obs/Cargo.toml @@ -36,6 +36,8 @@ gpu = ["dep:nvml-wrapper"] rustfs-config = { workspace = true, features = ["constants", "observability"] } rustfs-utils = { workspace = true, features = ["ip", "path"] } flexi_logger = { workspace = true } +metrics = { workspace = true } +metrics-exporter-opentelemetry = { workspace = true } nu-ansi-term = { workspace = true } nvml-wrapper = { workspace = true, optional = true } opentelemetry = { workspace = true } @@ -47,7 +49,6 @@ opentelemetry-semantic-conventions = { workspace = true, features = ["semconv_ex serde = { workspace = true } smallvec = { workspace = true, features = ["serde"] } tracing = { workspace = true, features = ["std", "attributes"] } -tracing-core = { workspace = true } tracing-error = { workspace = true } tracing-opentelemetry = { workspace = true } tracing-subscriber = { workspace = true, features = ["registry", "std", "fmt", "env-filter", "tracing-log", "time", "local-time", "json"] } diff --git a/crates/obs/src/telemetry.rs b/crates/obs/src/telemetry.rs index 5af9db71..d5a089b1 100644 --- a/crates/obs/src/telemetry.rs +++ b/crates/obs/src/telemetry.rs @@ -19,6 +19,7 @@ use flexi_logger::{ WriteMode::{AsyncWith, BufferAndFlush}, style, }; +use metrics::counter; use nu_ansi_term::Color; use opentelemetry::trace::TracerProvider; use opentelemetry::{KeyValue, global}; @@ -233,6 +234,13 @@ pub(crate) fn init_telemetry(config: &OtelConfig) -> OtelGuard { meter_provider }; + match metrics_exporter_opentelemetry::Recorder::builder("order-service").install_global() { + Ok(_) => {} + Err(e) => { + eprintln!("Failed to set global metrics recorder: {:?}", e); + } + } + // initialize logger provider let logger_provider = { let mut builder = SdkLoggerProvider::builder().with_resource(res); @@ -307,7 +315,7 @@ pub(crate) fn init_telemetry(config: &OtelConfig) -> OtelGuard { OBSERVABILITY_METER_NAME.set(service_name.to_string()).ok(); } } - + counter!("rustfs.start.total").increment(1); return OtelGuard { tracer_provider: Some(tracer_provider), meter_provider: Some(meter_provider), diff --git a/crates/rio/Cargo.toml b/crates/rio/Cargo.toml index 8f7ea347..b5c7ba10 100644 --- a/crates/rio/Cargo.toml +++ b/crates/rio/Cargo.toml @@ -48,7 +48,6 @@ thiserror.workspace = true base64.workspace = true sha1.workspace = true sha2.workspace = true -base64-simd.workspace = true crc64fast-nvme.workspace = true s3s.workspace = true hex-simd.workspace = true diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index 4f21f608..ffb2b20c 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -35,7 +35,6 @@ futures = { workspace = true, optional = true } hashbrown = { workspace = true, optional = true } hex-simd = { workspace = true, optional = true } highway = { workspace = true, optional = true } -hickory-resolver = { workspace = true, optional = true } hmac = { workspace = true, optional = true } http = { workspace = true, optional = true } hyper = { workspace = true, optional = true } @@ -43,7 +42,6 @@ libc = { workspace = true, optional = true } local-ip-address = { workspace = true, optional = true } lz4 = { workspace = true, optional = true } md-5 = { workspace = true, optional = true } -moka = { workspace = true, optional = true, features = ["future"] } netif = { workspace = true, optional = true } nix = { workspace = true, optional = true } rand = { workspace = true, optional = true } @@ -83,7 +81,7 @@ workspace = true default = ["ip"] # features that are enabled by default ip = ["dep:local-ip-address"] # ip characteristics and their dependencies tls = ["dep:rustls", "dep:rustls-pemfile", "dep:rustls-pki-types"] # tls characteristics and their dependencies -net = ["ip", "dep:url", "dep:netif", "dep:futures", "dep:transform-stream", "dep:bytes", "dep:s3s", "dep:hyper", "dep:hickory-resolver", "dep:moka", "dep:thiserror", "dep:tokio"] # network features with DNS resolver +net = ["ip", "dep:url", "dep:netif", "dep:futures", "dep:transform-stream", "dep:bytes", "dep:s3s", "dep:hyper", "dep:thiserror", "dep:tokio"] # network features with DNS resolver io = ["dep:tokio"] path = [] notify = ["dep:hyper", "dep:s3s", "dep:hashbrown", "dep:thiserror", "dep:serde", "dep:libc"] # file system notification features diff --git a/crates/utils/src/dns_resolver.rs b/crates/utils/src/dns_resolver.rs index 43b2d1b1..c9ee0e47 100644 --- a/crates/utils/src/dns_resolver.rs +++ b/crates/utils/src/dns_resolver.rs @@ -12,465 +12,465 @@ // See the License for the specific language governing permissions and // limitations under the License. -#![allow(dead_code)] - -//! Layered DNS resolution utility for Kubernetes environments -//! -//! This module provides robust DNS resolution with multiple fallback layers: -//! 1. Local cache (Moka) for previously resolved results -//! 2. System DNS resolver (container/host adaptive) using hickory-resolver -//! 3. Public DNS servers as final fallback (8.8.8.8, 1.1.1.1) using hickory-resolver with TLS -//! -//! The resolver is designed to handle 5-level or deeper domain names that may fail -//! in Kubernetes environments due to CoreDNS configuration, DNS recursion limits, -//! or network-related issues. Uses hickory-resolver for actual DNS queries with TLS support. - -use hickory_resolver::Resolver; -use hickory_resolver::config::ResolverConfig; -use hickory_resolver::name_server::TokioConnectionProvider; -use moka::future::Cache; -use std::net::IpAddr; -use std::sync::OnceLock; -use std::time::Duration; -use tracing::{debug, error, info, instrument, warn}; - -/// Maximum FQDN length according to RFC standards -const MAX_FQDN_LENGTH: usize = 253; -/// Maximum DNS label length according to RFC standards -const MAX_LABEL_LENGTH: usize = 63; -/// Cache entry TTL in seconds -const CACHE_TTL_SECONDS: u64 = 300; // 5 minutes -/// Maximum cache size (number of entries) -const MAX_CACHE_SIZE: u64 = 10000; - -/// DNS resolution error types with detailed context and tracing information -#[derive(Debug, thiserror::Error)] -pub enum DnsError { - #[error("Invalid domain format: {reason}")] - InvalidFormat { reason: String }, - - #[error("Local cache miss for domain: {domain}")] - CacheMiss { domain: String }, - - #[error("System DNS resolution failed for domain: {domain} - {source}")] - SystemDnsFailed { - domain: String, - #[source] - source: Box, - }, - - #[error("Public DNS resolution failed for domain: {domain} - {source}")] - PublicDnsFailed { - domain: String, - #[source] - source: Box, - }, - - #[error( - "All DNS resolution attempts failed for domain: {domain}. Please check your domain spelling, network connectivity, or DNS configuration" - )] - AllAttemptsFailed { domain: String }, - - #[error("DNS resolver initialization failed: {source}")] - InitializationFailed { - #[source] - source: Box, - }, - - #[error("DNS configuration error: {source}")] - ConfigurationError { - #[source] - source: Box, - }, -} - -/// Layered DNS resolver with caching and multiple fallback strategies -pub struct LayeredDnsResolver { - /// Local cache for resolved domains using Moka for high performance - cache: Cache>, - /// System DNS resolver using hickory-resolver with default configuration - system_resolver: Resolver, - /// Public DNS resolver using hickory-resolver with Cloudflare DNS servers - public_resolver: Resolver, -} - -impl LayeredDnsResolver { - /// Create a new layered DNS resolver with automatic DNS configuration detection - #[instrument(skip_all)] - pub async fn new() -> Result { - info!("Initializing layered DNS resolver with hickory-resolver, Moka cache and public DNS fallback"); - - // Create Moka cache with TTL and size limits - let cache = Cache::builder() - .time_to_live(Duration::from_secs(CACHE_TTL_SECONDS)) - .max_capacity(MAX_CACHE_SIZE) - .build(); - - // Create system DNS resolver with default configuration (auto-detects container/host DNS) - let system_resolver = - Resolver::builder_with_config(ResolverConfig::default(), TokioConnectionProvider::default()).build(); - - let mut config = ResolverConfig::cloudflare_tls(); - for ns in ResolverConfig::google_tls().name_servers() { - config.add_name_server(ns.clone()) - } - // Create public DNS resolver using Cloudflare DNS with TLS support - let public_resolver = Resolver::builder_with_config(config, TokioConnectionProvider::default()).build(); - - info!("DNS resolver initialized successfully with hickory-resolver system and Cloudflare TLS public fallback"); - - Ok(Self { - cache, - system_resolver, - public_resolver, - }) - } - - /// Validate domain format according to RFC standards - #[instrument(skip_all, fields(domain = %domain))] - fn validate_domain_format(domain: &str) -> Result<(), DnsError> { - info!("Validating domain format start"); - // Check FQDN length - if domain.len() > MAX_FQDN_LENGTH { - return Err(DnsError::InvalidFormat { - reason: format!("FQDN must not exceed {} bytes, got {} bytes", MAX_FQDN_LENGTH, domain.len()), - }); - } - - // Check each label length - for label in domain.split('.') { - if label.len() > MAX_LABEL_LENGTH { - return Err(DnsError::InvalidFormat { - reason: format!( - "Each label must not exceed {} bytes, label '{}' has {} bytes", - MAX_LABEL_LENGTH, - label, - label.len() - ), - }); - } - } - - // Check for empty labels (except trailing dot) - let labels: Vec<&str> = domain.trim_end_matches('.').split('.').collect(); - for label in &labels { - if label.is_empty() { - return Err(DnsError::InvalidFormat { - reason: "Domain contains empty labels".to_string(), - }); - } - } - info!("DNS resolver validated successfully"); - Ok(()) - } - - /// Check local cache for resolved domain - #[instrument(skip_all, fields(domain = %domain))] - async fn check_cache(&self, domain: &str) -> Option> { - match self.cache.get(domain).await { - Some(ips) => { - debug!("DNS cache hit for domain: {}, found {} IPs", domain, ips.len()); - Some(ips) - } - None => { - debug!("DNS cache miss for domain: {}", domain); - None - } - } - } - - /// Update local cache with resolved IPs - #[instrument(skip_all, fields(domain = %domain, ip_count = ips.len()))] - async fn update_cache(&self, domain: &str, ips: Vec) { - self.cache.insert(domain.to_string(), ips.clone()).await; - debug!("DNS cache updated for domain: {} with {} IPs", domain, ips.len()); - } - - /// Get cache statistics for monitoring - #[instrument(skip_all)] - pub async fn cache_stats(&self) -> (u64, u64) { - let entry_count = self.cache.entry_count(); - let weighted_size = self.cache.weighted_size(); - debug!("DNS cache stats - entries: {}, weighted_size: {}", entry_count, weighted_size); - (entry_count, weighted_size) - } - - /// Manually invalidate cache entries (useful for testing or forced refresh) - #[instrument(skip_all)] - pub async fn invalidate_cache(&self) { - self.cache.invalidate_all(); - info!("DNS cache invalidated"); - } - - /// Resolve domain using system DNS (cluster/host DNS configuration) with hickory-resolver - #[instrument(skip_all, fields(domain = %domain))] - async fn resolve_with_system_dns(&self, domain: &str) -> Result, DnsError> { - debug!("Attempting system DNS resolution for domain: {} using hickory-resolver", domain); - - match self.system_resolver.lookup_ip(domain).await { - Ok(lookup) => { - let ips: Vec = lookup.iter().collect(); - if !ips.is_empty() { - info!("System DNS resolution successful for domain: {} -> {} IPs", domain, ips.len()); - Ok(ips) - } else { - warn!("System DNS returned empty result for domain: {}", domain); - Err(DnsError::SystemDnsFailed { - domain: domain.to_string(), - source: "No IP addresses found".to_string().into(), - }) - } - } - Err(e) => { - warn!("System DNS resolution failed for domain: {} - {}", domain, e); - Err(DnsError::SystemDnsFailed { - domain: domain.to_string(), - source: Box::new(e), - }) - } - } - } - - /// Resolve domain using public DNS servers (Cloudflare TLS DNS) with hickory-resolver - #[instrument(skip_all, fields(domain = %domain))] - async fn resolve_with_public_dns(&self, domain: &str) -> Result, DnsError> { - debug!( - "Attempting public DNS resolution for domain: {} using hickory-resolver with TLS-enabled Cloudflare DNS", - domain - ); - - match self.public_resolver.lookup_ip(domain).await { - Ok(lookup) => { - let ips: Vec = lookup.iter().collect(); - if !ips.is_empty() { - info!("Public DNS resolution successful for domain: {} -> {} IPs", domain, ips.len()); - Ok(ips) - } else { - warn!("Public DNS returned empty result for domain: {}", domain); - Err(DnsError::PublicDnsFailed { - domain: domain.to_string(), - source: "No IP addresses found".to_string().into(), - }) - } - } - Err(e) => { - error!("Public DNS resolution failed for domain: {} - {}", domain, e); - Err(DnsError::PublicDnsFailed { - domain: domain.to_string(), - source: Box::new(e), - }) - } - } - } - - /// Resolve domain with layered fallback strategy using hickory-resolver - /// - /// Resolution order with detailed tracing: - /// 1. Local cache (Moka with TTL) - /// 2. System DNS (hickory-resolver with host/container adaptive configuration) - /// 3. Public DNS (hickory-resolver with TLS-enabled Cloudflare DNS fallback) - #[instrument(skip_all, fields(domain = %domain))] - pub async fn resolve(&self, domain: &str) -> Result, DnsError> { - info!("Starting DNS resolution process for domain: {} start", domain); - // Validate domain format first - Self::validate_domain_format(domain)?; - - info!("Starting DNS resolution for domain: {}", domain); - - // Step 1: Check local cache - if let Some(ips) = self.check_cache(domain).await { - info!("DNS resolution completed from cache for domain: {} -> {} IPs", domain, ips.len()); - return Ok(ips); - } - - debug!("Local cache miss for domain: {}, attempting system DNS", domain); - - // Step 2: Try system DNS (cluster/host adaptive) - match self.resolve_with_system_dns(domain).await { - Ok(ips) => { - self.update_cache(domain, ips.clone()).await; - info!("DNS resolution completed via system DNS for domain: {} -> {} IPs", domain, ips.len()); - return Ok(ips); - } - Err(system_err) => { - warn!("System DNS failed for domain: {} - {}", domain, system_err); - } - } - - // Step 3: Fallback to public DNS - info!("Falling back to public DNS for domain: {}", domain); - match self.resolve_with_public_dns(domain).await { - Ok(ips) => { - self.update_cache(domain, ips.clone()).await; - info!("DNS resolution completed via public DNS for domain: {} -> {} IPs", domain, ips.len()); - Ok(ips) - } - Err(public_err) => { - error!( - "All DNS resolution attempts failed for domain:` {}`. System DNS: failed, Public DNS: {}", - domain, public_err - ); - Err(DnsError::AllAttemptsFailed { - domain: domain.to_string(), - }) - } - } - } -} - -/// Global DNS resolver instance -static GLOBAL_DNS_RESOLVER: OnceLock = OnceLock::new(); - -/// Initialize the global DNS resolver -#[instrument] -pub async fn init_global_dns_resolver() -> Result<(), DnsError> { - info!("Initializing global DNS resolver"); - let resolver = LayeredDnsResolver::new().await?; - - match GLOBAL_DNS_RESOLVER.set(resolver) { - Ok(()) => { - info!("Global DNS resolver initialized successfully"); - Ok(()) - } - Err(_) => { - warn!("Global DNS resolver was already initialized"); - Ok(()) - } - } -} - -/// Get the global DNS resolver instance -pub fn get_global_dns_resolver() -> Option<&'static LayeredDnsResolver> { - GLOBAL_DNS_RESOLVER.get() -} - -/// Resolve domain using the global DNS resolver with comprehensive tracing -#[instrument(skip_all, fields(domain = %domain))] -pub async fn resolve_domain(domain: &str) -> Result, DnsError> { - info!("resolving domain for: {}", domain); - match get_global_dns_resolver() { - Some(resolver) => resolver.resolve(domain).await, - None => Err(DnsError::InitializationFailed { - source: "Global DNS resolver not initialized. Call init_global_dns_resolver() first." - .to_string() - .into(), - }), - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_domain_validation() { - // Valid domains - assert!(LayeredDnsResolver::validate_domain_format("example.com").is_ok()); - assert!(LayeredDnsResolver::validate_domain_format("sub.example.com").is_ok()); - assert!(LayeredDnsResolver::validate_domain_format("very.deep.sub.domain.example.com").is_ok()); - - // Invalid domains - too long FQDN - let long_domain = "a".repeat(254); - assert!(LayeredDnsResolver::validate_domain_format(&long_domain).is_err()); - - // Invalid domains - label too long - let long_label = format!("{}.com", "a".repeat(64)); - assert!(LayeredDnsResolver::validate_domain_format(&long_label).is_err()); - - // Invalid domains - empty label - assert!(LayeredDnsResolver::validate_domain_format("example..com").is_err()); - } - - #[tokio::test] - async fn test_cache_functionality() { - let resolver = LayeredDnsResolver::new().await.unwrap(); - - // Test cache miss - assert!(resolver.check_cache("example.com").await.is_none()); - - // Update cache - let test_ips = vec![IpAddr::from([192, 0, 2, 1])]; - resolver.update_cache("example.com", test_ips.clone()).await; - - // Test cache hit - assert_eq!(resolver.check_cache("example.com").await, Some(test_ips)); - - // Test cache stats (note: moka cache might not immediately reflect changes) - let (total, _weighted_size) = resolver.cache_stats().await; - // Cache should have at least the entry we just added (might be 0 due to async nature) - assert!(total <= 1, "Cache should have at most 1 entry, got {total}"); - } - - #[tokio::test] - async fn test_dns_resolution() { - let resolver = LayeredDnsResolver::new().await.unwrap(); - - // Test resolution of a known domain (localhost should always resolve) - match resolver.resolve("localhost").await { - Ok(ips) => { - assert!(!ips.is_empty()); - println!("Resolved localhost to: {ips:?}"); - } - Err(e) => { - // In some test environments, even localhost might fail - // This is acceptable as long as our error handling works - println!("DNS resolution failed (might be expected in test environments): {e}"); - } - } - } - - #[tokio::test] - async fn test_invalid_domain_resolution() { - let resolver = LayeredDnsResolver::new().await.unwrap(); - - // Test resolution of invalid domain - let result = resolver - .resolve("nonexistent.invalid.domain.example.thisdefinitelydoesnotexist") - .await; - assert!(result.is_err()); - - if let Err(e) = result { - println!("Expected error for invalid domain: {e}"); - // Should be AllAttemptsFailed since both system and public DNS should fail - assert!(matches!(e, DnsError::AllAttemptsFailed { .. })); - } - } - - #[tokio::test] - async fn test_cache_invalidation() { - let resolver = LayeredDnsResolver::new().await.unwrap(); - - // Add entry to cache - let test_ips = vec![IpAddr::from([192, 0, 2, 1])]; - resolver.update_cache("test.example.com", test_ips.clone()).await; - - // Verify cache hit - assert_eq!(resolver.check_cache("test.example.com").await, Some(test_ips)); - - // Invalidate cache - resolver.invalidate_cache().await; - - // Verify cache miss after invalidation - assert!(resolver.check_cache("test.example.com").await.is_none()); - } - - #[tokio::test] - async fn test_global_resolver_initialization() { - // Test initialization - assert!(init_global_dns_resolver().await.is_ok()); - - // Test that resolver is available - assert!(get_global_dns_resolver().is_some()); - - // Test domain resolution through global resolver - match resolve_domain("localhost").await { - Ok(ips) => { - assert!(!ips.is_empty()); - println!("Global resolver resolved localhost to: {ips:?}"); - } - Err(e) => { - println!("Global resolver DNS resolution failed (might be expected in test environments): {e}"); - } - } - } -} +// #![allow(dead_code)] +// +// //! Layered DNS resolution utility for Kubernetes environments +// //! +// //! This module provides robust DNS resolution with multiple fallback layers: +// //! 1. Local cache (Moka) for previously resolved results +// //! 2. System DNS resolver (container/host adaptive) using hickory-resolver +// //! 3. Public DNS servers as final fallback (8.8.8.8, 1.1.1.1) using hickory-resolver with TLS +// //! +// //! The resolver is designed to handle 5-level or deeper domain names that may fail +// //! in Kubernetes environments due to CoreDNS configuration, DNS recursion limits, +// //! or network-related issues. Uses hickory-resolver for actual DNS queries with TLS support. +// +// use hickory_resolver::Resolver; +// use hickory_resolver::config::ResolverConfig; +// use hickory_resolver::name_server::TokioConnectionProvider; +// use moka::future::Cache; +// use std::net::IpAddr; +// use std::sync::OnceLock; +// use std::time::Duration; +// use tracing::{debug, error, info, instrument, warn}; +// +// /// Maximum FQDN length according to RFC standards +// const MAX_FQDN_LENGTH: usize = 253; +// /// Maximum DNS label length according to RFC standards +// const MAX_LABEL_LENGTH: usize = 63; +// /// Cache entry TTL in seconds +// const CACHE_TTL_SECONDS: u64 = 300; // 5 minutes +// /// Maximum cache size (number of entries) +// const MAX_CACHE_SIZE: u64 = 10000; +// +// /// DNS resolution error types with detailed context and tracing information +// #[derive(Debug, thiserror::Error)] +// pub enum DnsError { +// #[error("Invalid domain format: {reason}")] +// InvalidFormat { reason: String }, +// +// #[error("Local cache miss for domain: {domain}")] +// CacheMiss { domain: String }, +// +// #[error("System DNS resolution failed for domain: {domain} - {source}")] +// SystemDnsFailed { +// domain: String, +// #[source] +// source: Box, +// }, +// +// #[error("Public DNS resolution failed for domain: {domain} - {source}")] +// PublicDnsFailed { +// domain: String, +// #[source] +// source: Box, +// }, +// +// #[error( +// "All DNS resolution attempts failed for domain: {domain}. Please check your domain spelling, network connectivity, or DNS configuration" +// )] +// AllAttemptsFailed { domain: String }, +// +// #[error("DNS resolver initialization failed: {source}")] +// InitializationFailed { +// #[source] +// source: Box, +// }, +// +// #[error("DNS configuration error: {source}")] +// ConfigurationError { +// #[source] +// source: Box, +// }, +// } +// +// /// Layered DNS resolver with caching and multiple fallback strategies +// pub struct LayeredDnsResolver { +// /// Local cache for resolved domains using Moka for high performance +// cache: Cache>, +// /// System DNS resolver using hickory-resolver with default configuration +// system_resolver: Resolver, +// /// Public DNS resolver using hickory-resolver with Cloudflare DNS servers +// public_resolver: Resolver, +// } +// +// impl LayeredDnsResolver { +// /// Create a new layered DNS resolver with automatic DNS configuration detection +// #[instrument(skip_all)] +// pub async fn new() -> Result { +// info!("Initializing layered DNS resolver with hickory-resolver, Moka cache and public DNS fallback"); +// +// // Create Moka cache with TTL and size limits +// let cache = Cache::builder() +// .time_to_live(Duration::from_secs(CACHE_TTL_SECONDS)) +// .max_capacity(MAX_CACHE_SIZE) +// .build(); +// +// // Create system DNS resolver with default configuration (auto-detects container/host DNS) +// let system_resolver = +// Resolver::builder_with_config(ResolverConfig::default(), TokioConnectionProvider::default()).build(); +// +// let mut config = ResolverConfig::cloudflare_tls(); +// for ns in ResolverConfig::google_tls().name_servers() { +// config.add_name_server(ns.clone()) +// } +// // Create public DNS resolver using Cloudflare DNS with TLS support +// let public_resolver = Resolver::builder_with_config(config, TokioConnectionProvider::default()).build(); +// +// info!("DNS resolver initialized successfully with hickory-resolver system and Cloudflare TLS public fallback"); +// +// Ok(Self { +// cache, +// system_resolver, +// public_resolver, +// }) +// } +// +// /// Validate domain format according to RFC standards +// #[instrument(skip_all, fields(domain = %domain))] +// fn validate_domain_format(domain: &str) -> Result<(), DnsError> { +// info!("Validating domain format start"); +// // Check FQDN length +// if domain.len() > MAX_FQDN_LENGTH { +// return Err(DnsError::InvalidFormat { +// reason: format!("FQDN must not exceed {} bytes, got {} bytes", MAX_FQDN_LENGTH, domain.len()), +// }); +// } +// +// // Check each label length +// for label in domain.split('.') { +// if label.len() > MAX_LABEL_LENGTH { +// return Err(DnsError::InvalidFormat { +// reason: format!( +// "Each label must not exceed {} bytes, label '{}' has {} bytes", +// MAX_LABEL_LENGTH, +// label, +// label.len() +// ), +// }); +// } +// } +// +// // Check for empty labels (except trailing dot) +// let labels: Vec<&str> = domain.trim_end_matches('.').split('.').collect(); +// for label in &labels { +// if label.is_empty() { +// return Err(DnsError::InvalidFormat { +// reason: "Domain contains empty labels".to_string(), +// }); +// } +// } +// info!("DNS resolver validated successfully"); +// Ok(()) +// } +// +// /// Check local cache for resolved domain +// #[instrument(skip_all, fields(domain = %domain))] +// async fn check_cache(&self, domain: &str) -> Option> { +// match self.cache.get(domain).await { +// Some(ips) => { +// debug!("DNS cache hit for domain: {}, found {} IPs", domain, ips.len()); +// Some(ips) +// } +// None => { +// debug!("DNS cache miss for domain: {}", domain); +// None +// } +// } +// } +// +// /// Update local cache with resolved IPs +// #[instrument(skip_all, fields(domain = %domain, ip_count = ips.len()))] +// async fn update_cache(&self, domain: &str, ips: Vec) { +// self.cache.insert(domain.to_string(), ips.clone()).await; +// debug!("DNS cache updated for domain: {} with {} IPs", domain, ips.len()); +// } +// +// /// Get cache statistics for monitoring +// #[instrument(skip_all)] +// pub async fn cache_stats(&self) -> (u64, u64) { +// let entry_count = self.cache.entry_count(); +// let weighted_size = self.cache.weighted_size(); +// debug!("DNS cache stats - entries: {}, weighted_size: {}", entry_count, weighted_size); +// (entry_count, weighted_size) +// } +// +// /// Manually invalidate cache entries (useful for testing or forced refresh) +// #[instrument(skip_all)] +// pub async fn invalidate_cache(&self) { +// self.cache.invalidate_all(); +// info!("DNS cache invalidated"); +// } +// +// /// Resolve domain using system DNS (cluster/host DNS configuration) with hickory-resolver +// #[instrument(skip_all, fields(domain = %domain))] +// async fn resolve_with_system_dns(&self, domain: &str) -> Result, DnsError> { +// debug!("Attempting system DNS resolution for domain: {} using hickory-resolver", domain); +// +// match self.system_resolver.lookup_ip(domain).await { +// Ok(lookup) => { +// let ips: Vec = lookup.iter().collect(); +// if !ips.is_empty() { +// info!("System DNS resolution successful for domain: {} -> {} IPs", domain, ips.len()); +// Ok(ips) +// } else { +// warn!("System DNS returned empty result for domain: {}", domain); +// Err(DnsError::SystemDnsFailed { +// domain: domain.to_string(), +// source: "No IP addresses found".to_string().into(), +// }) +// } +// } +// Err(e) => { +// warn!("System DNS resolution failed for domain: {} - {}", domain, e); +// Err(DnsError::SystemDnsFailed { +// domain: domain.to_string(), +// source: Box::new(e), +// }) +// } +// } +// } +// +// /// Resolve domain using public DNS servers (Cloudflare TLS DNS) with hickory-resolver +// #[instrument(skip_all, fields(domain = %domain))] +// async fn resolve_with_public_dns(&self, domain: &str) -> Result, DnsError> { +// debug!( +// "Attempting public DNS resolution for domain: {} using hickory-resolver with TLS-enabled Cloudflare DNS", +// domain +// ); +// +// match self.public_resolver.lookup_ip(domain).await { +// Ok(lookup) => { +// let ips: Vec = lookup.iter().collect(); +// if !ips.is_empty() { +// info!("Public DNS resolution successful for domain: {} -> {} IPs", domain, ips.len()); +// Ok(ips) +// } else { +// warn!("Public DNS returned empty result for domain: {}", domain); +// Err(DnsError::PublicDnsFailed { +// domain: domain.to_string(), +// source: "No IP addresses found".to_string().into(), +// }) +// } +// } +// Err(e) => { +// error!("Public DNS resolution failed for domain: {} - {}", domain, e); +// Err(DnsError::PublicDnsFailed { +// domain: domain.to_string(), +// source: Box::new(e), +// }) +// } +// } +// } +// +// /// Resolve domain with layered fallback strategy using hickory-resolver +// /// +// /// Resolution order with detailed tracing: +// /// 1. Local cache (Moka with TTL) +// /// 2. System DNS (hickory-resolver with host/container adaptive configuration) +// /// 3. Public DNS (hickory-resolver with TLS-enabled Cloudflare DNS fallback) +// #[instrument(skip_all, fields(domain = %domain))] +// pub async fn resolve(&self, domain: &str) -> Result, DnsError> { +// info!("Starting DNS resolution process for domain: {} start", domain); +// // Validate domain format first +// Self::validate_domain_format(domain)?; +// +// info!("Starting DNS resolution for domain: {}", domain); +// +// // Step 1: Check local cache +// if let Some(ips) = self.check_cache(domain).await { +// info!("DNS resolution completed from cache for domain: {} -> {} IPs", domain, ips.len()); +// return Ok(ips); +// } +// +// debug!("Local cache miss for domain: {}, attempting system DNS", domain); +// +// // Step 2: Try system DNS (cluster/host adaptive) +// match self.resolve_with_system_dns(domain).await { +// Ok(ips) => { +// self.update_cache(domain, ips.clone()).await; +// info!("DNS resolution completed via system DNS for domain: {} -> {} IPs", domain, ips.len()); +// return Ok(ips); +// } +// Err(system_err) => { +// warn!("System DNS failed for domain: {} - {}", domain, system_err); +// } +// } +// +// // Step 3: Fallback to public DNS +// info!("Falling back to public DNS for domain: {}", domain); +// match self.resolve_with_public_dns(domain).await { +// Ok(ips) => { +// self.update_cache(domain, ips.clone()).await; +// info!("DNS resolution completed via public DNS for domain: {} -> {} IPs", domain, ips.len()); +// Ok(ips) +// } +// Err(public_err) => { +// error!( +// "All DNS resolution attempts failed for domain:` {}`. System DNS: failed, Public DNS: {}", +// domain, public_err +// ); +// Err(DnsError::AllAttemptsFailed { +// domain: domain.to_string(), +// }) +// } +// } +// } +// } +// +// /// Global DNS resolver instance +// static GLOBAL_DNS_RESOLVER: OnceLock = OnceLock::new(); +// +// /// Initialize the global DNS resolver +// #[instrument] +// pub async fn init_global_dns_resolver() -> Result<(), DnsError> { +// info!("Initializing global DNS resolver"); +// let resolver = LayeredDnsResolver::new().await?; +// +// match GLOBAL_DNS_RESOLVER.set(resolver) { +// Ok(()) => { +// info!("Global DNS resolver initialized successfully"); +// Ok(()) +// } +// Err(_) => { +// warn!("Global DNS resolver was already initialized"); +// Ok(()) +// } +// } +// } +// +// /// Get the global DNS resolver instance +// pub fn get_global_dns_resolver() -> Option<&'static LayeredDnsResolver> { +// GLOBAL_DNS_RESOLVER.get() +// } +// +// /// Resolve domain using the global DNS resolver with comprehensive tracing +// #[instrument(skip_all, fields(domain = %domain))] +// pub async fn resolve_domain(domain: &str) -> Result, DnsError> { +// info!("resolving domain for: {}", domain); +// match get_global_dns_resolver() { +// Some(resolver) => resolver.resolve(domain).await, +// None => Err(DnsError::InitializationFailed { +// source: "Global DNS resolver not initialized. Call init_global_dns_resolver() first." +// .to_string() +// .into(), +// }), +// } +// } +// +// #[cfg(test)] +// mod tests { +// use super::*; +// +// #[test] +// fn test_domain_validation() { +// // Valid domains +// assert!(LayeredDnsResolver::validate_domain_format("example.com").is_ok()); +// assert!(LayeredDnsResolver::validate_domain_format("sub.example.com").is_ok()); +// assert!(LayeredDnsResolver::validate_domain_format("very.deep.sub.domain.example.com").is_ok()); +// +// // Invalid domains - too long FQDN +// let long_domain = "a".repeat(254); +// assert!(LayeredDnsResolver::validate_domain_format(&long_domain).is_err()); +// +// // Invalid domains - label too long +// let long_label = format!("{}.com", "a".repeat(64)); +// assert!(LayeredDnsResolver::validate_domain_format(&long_label).is_err()); +// +// // Invalid domains - empty label +// assert!(LayeredDnsResolver::validate_domain_format("example..com").is_err()); +// } +// +// #[tokio::test] +// async fn test_cache_functionality() { +// let resolver = LayeredDnsResolver::new().await.unwrap(); +// +// // Test cache miss +// assert!(resolver.check_cache("example.com").await.is_none()); +// +// // Update cache +// let test_ips = vec![IpAddr::from([192, 0, 2, 1])]; +// resolver.update_cache("example.com", test_ips.clone()).await; +// +// // Test cache hit +// assert_eq!(resolver.check_cache("example.com").await, Some(test_ips)); +// +// // Test cache stats (note: moka cache might not immediately reflect changes) +// let (total, _weighted_size) = resolver.cache_stats().await; +// // Cache should have at least the entry we just added (might be 0 due to async nature) +// assert!(total <= 1, "Cache should have at most 1 entry, got {total}"); +// } +// +// #[tokio::test] +// async fn test_dns_resolution() { +// let resolver = LayeredDnsResolver::new().await.unwrap(); +// +// // Test resolution of a known domain (localhost should always resolve) +// match resolver.resolve("localhost").await { +// Ok(ips) => { +// assert!(!ips.is_empty()); +// println!("Resolved localhost to: {ips:?}"); +// } +// Err(e) => { +// // In some test environments, even localhost might fail +// // This is acceptable as long as our error handling works +// println!("DNS resolution failed (might be expected in test environments): {e}"); +// } +// } +// } +// +// #[tokio::test] +// async fn test_invalid_domain_resolution() { +// let resolver = LayeredDnsResolver::new().await.unwrap(); +// +// // Test resolution of invalid domain +// let result = resolver +// .resolve("nonexistent.invalid.domain.example.thisdefinitelydoesnotexist") +// .await; +// assert!(result.is_err()); +// +// if let Err(e) = result { +// println!("Expected error for invalid domain: {e}"); +// // Should be AllAttemptsFailed since both system and public DNS should fail +// assert!(matches!(e, DnsError::AllAttemptsFailed { .. })); +// } +// } +// +// #[tokio::test] +// async fn test_cache_invalidation() { +// let resolver = LayeredDnsResolver::new().await.unwrap(); +// +// // Add entry to cache +// let test_ips = vec![IpAddr::from([192, 0, 2, 1])]; +// resolver.update_cache("test.example.com", test_ips.clone()).await; +// +// // Verify cache hit +// assert_eq!(resolver.check_cache("test.example.com").await, Some(test_ips)); +// +// // Invalidate cache +// resolver.invalidate_cache().await; +// +// // Verify cache miss after invalidation +// assert!(resolver.check_cache("test.example.com").await.is_none()); +// } +// +// #[tokio::test] +// async fn test_global_resolver_initialization() { +// // Test initialization +// assert!(init_global_dns_resolver().await.is_ok()); +// +// // Test that resolver is available +// assert!(get_global_dns_resolver().is_some()); +// +// // Test domain resolution through global resolver +// match resolve_domain("localhost").await { +// Ok(ips) => { +// assert!(!ips.is_empty()); +// println!("Global resolver resolved localhost to: {ips:?}"); +// } +// Err(e) => { +// println!("Global resolver DNS resolution failed (might be expected in test environments): {e}"); +// } +// } +// } +// } diff --git a/crates/utils/src/lib.rs b/crates/utils/src/lib.rs index b8970d08..627c8aa1 100644 --- a/crates/utils/src/lib.rs +++ b/crates/utils/src/lib.rs @@ -24,8 +24,6 @@ pub mod net; #[cfg(feature = "http")] pub mod http; -#[cfg(feature = "net")] -pub use dns_resolver::*; #[cfg(feature = "net")] pub use net::*; diff --git a/crates/utils/src/net.rs b/crates/utils/src/net.rs index e12734de..5769d654 100644 --- a/crates/utils/src/net.rs +++ b/crates/utils/src/net.rs @@ -148,17 +148,6 @@ pub fn is_local_host(host: Host<&str>, port: u16, local_port: u16) -> std::io::R pub async fn get_host_ip(host: Host<&str>) -> std::io::Result> { match host { Host::Domain(domain) => { - match crate::dns_resolver::resolve_domain(domain).await { - Ok(ips) => { - info!("Resolved domain {domain} using custom DNS resolver: {ips:?}"); - return Ok(ips.into_iter().collect()); - } - Err(err) => { - error!( - "Failed to resolve domain {domain} using custom DNS resolver, falling back to system resolver,err: {err}" - ); - } - } // Check cache first if CUSTOM_DNS_RESOLVER.read().unwrap().is_none() { if let Ok(mut cache) = DNS_CACHE.lock() { @@ -321,7 +310,6 @@ where #[cfg(test)] mod test { use super::*; - use crate::init_global_dns_resolver; use std::net::{Ipv4Addr, Ipv6Addr}; use std::{collections::HashSet, io::Error as IoError}; @@ -448,12 +436,7 @@ mod test { #[tokio::test] async fn test_get_host_ip() { set_mock_dns_resolver(mock_resolver); - match init_global_dns_resolver().await { - Ok(_) => {} - Err(e) => { - error!("Failed to initialize global DNS resolver: {e}"); - } - } + // Test IPv4 address let ipv4_host = Host::Ipv4(Ipv4Addr::new(192, 168, 1, 1)); let ipv4_result = get_host_ip(ipv4_host).await.unwrap(); diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index f57ec0ed..7e5ff4e1 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -122,6 +122,7 @@ uuid = { workspace = true } zip = { workspace = true } base64-simd.workspace = true hex-simd.workspace = true +metrics = { workspace = true } [target.'cfg(any(target_os = "macos", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd"))'.dependencies] sysctl = { workspace = true } diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 9fa65a59..64598436 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -158,13 +158,6 @@ async fn async_main() -> Result<()> { async fn run(opt: config::Opt) -> Result<()> { debug!("opt: {:?}", &opt); - // Initialize global DNS resolver early for enhanced DNS resolution (concurrent) - let dns_init = tokio::spawn(async { - if let Err(e) = rustfs_utils::dns_resolver::init_global_dns_resolver().await { - warn!("Failed to initialize global DNS resolver: {}. Using standard DNS resolution.", e); - } - }); - if let Some(region) = &opt.region { rustfs_ecstore::global::set_global_region(region.clone()); } @@ -190,9 +183,6 @@ async fn run(opt: config::Opt) -> Result<()> { set_global_addr(&opt.address).await; - // Wait for DNS initialization to complete before network-heavy operations - dns_init.await.map_err(Error::other)?; - // For RPC let (endpoint_pools, setup_type) = EndpointServerPools::from_volumes(server_address.clone().as_str(), opt.volumes.clone()) .await diff --git a/rustfs/src/server/http.rs b/rustfs/src/server/http.rs index a57aceb4..828ac691 100644 --- a/rustfs/src/server/http.rs +++ b/rustfs/src/server/http.rs @@ -27,6 +27,7 @@ use hyper_util::{ server::graceful::GracefulShutdown, service::TowerToHyperService, }; +use metrics::counter; use rustfs_config::{DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY, MI_B, RUSTFS_TLS_CERT, RUSTFS_TLS_KEY}; use rustfs_obs::SystemObserver; use rustfs_protos::proto_gen::node_service::node_service_server::NodeServiceServer; @@ -488,7 +489,12 @@ fn process_connection( key_request_uri_path = %request.uri().path().to_owned(), "handle request api total", ); - debug!("http started method: {}, url path: {}", request.method(), request.uri().path()) + debug!("http started method: {}, url path: {}", request.method(), request.uri().path()); + let labels = [ + ("key_request_method", format!("{}", request.method())), + ("key_request_uri_path", request.uri().path().to_owned().to_string()), + ]; + counter!("rustfs_api_requests_total", &labels).increment(1); }) .on_response(|response: &Response<_>, latency: Duration, _span: &Span| { _span.record("http response status_code", tracing::field::display(response.status())); diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index aefdf3a5..7453ea65 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -30,6 +30,7 @@ use datafusion::arrow::{ }; use futures::StreamExt; use http::{HeaderMap, StatusCode}; +use metrics::counter; use rustfs_ecstore::{ bucket::{ lifecycle::{bucket_lifecycle_ops::validate_transition_tier, lifecycle::Lifecycle}, @@ -603,6 +604,8 @@ impl S3 for FS { return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())); }; + counter!("rustfs_create_bucket_total").increment(1); + store .make_bucket( &bucket,