From b0e2b354881af1467b6858f77e72d06b78f771bf Mon Sep 17 00:00:00 2001 From: Shaidyk Date: Wed, 24 Jun 2026 17:18:56 +0300 Subject: [PATCH] fix: resolve #44 - Update all outdated dependencies --- Cargo.lock | 514 +++++++++++++++++++++++++++++--------------------- Cargo.toml | 44 ++--- build.rs | 2 +- src/main.rs | 78 ++++---- tests/news.rs | 101 ++++++++++ 5 files changed, 457 insertions(+), 282 deletions(-) create mode 100644 tests/news.rs diff --git a/Cargo.lock b/Cargo.lock index 348b5a3..34d5a51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - [[package]] name = "aho-corasick" version = "1.1.3" @@ -43,9 +28,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arrayvec" @@ -86,6 +71,12 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" @@ -194,21 +185,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.21.7" @@ -229,9 +205,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "block-buffer" @@ -312,6 +288,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -364,7 +350,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.13.0", "crossterm_winapi", "libc", "mio 0.8.11", @@ -671,12 +657,6 @@ dependencies = [ "syn 2.0.89", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "glob" version = "0.3.1" @@ -702,6 +682,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -750,12 +749,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "http" version = "0.2.12" @@ -840,14 +833,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -863,6 +856,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.15", "http 1.1.0", "http-body 1.0.1", "httparse", @@ -871,6 +865,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", ] [[package]] @@ -899,6 +894,19 @@ dependencies = [ "tokio-io-timeout", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.5.1", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.10" @@ -906,13 +914,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.1", "hyper 1.5.1", "pin-project-lite", + "socket2 0.5.8", "tokio", "tower-service", + "tracing", ] [[package]] @@ -1037,9 +1048,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.166" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "linked-hash-map" @@ -1128,15 +1139,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - [[package]] name = "mio" version = "0.8.11" @@ -1151,14 +1153,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ - "hermit-abi", "libc", "wasi", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1211,15 +1212,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.20.2" @@ -1228,9 +1220,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "opentelemetry" @@ -1250,9 +1242,9 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.22.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" +checksum = "570074cc999d1a58184080966e5bd3bf3a9a4af650c3b05047c2621e7405cd17" dependencies = [ "futures-core", "futures-sink", @@ -1260,7 +1252,20 @@ dependencies = [ "once_cell", "pin-project-lite", "thiserror 1.0.69", - "urlencoding", +] + +[[package]] +name = "opentelemetry" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab70038c28ed37b97d8ed414b6429d343a8bbf44c9f79ec854f3a643029ba6d7" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 1.0.69", + "tracing", ] [[package]] @@ -1289,18 +1294,6 @@ dependencies = [ "opentelemetry 0.21.0", ] -[[package]] -name = "opentelemetry-http" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7690dc77bf776713848c4faa6501157469017eaf332baccd4eb1cea928743d94" -dependencies = [ - "async-trait", - "bytes", - "http 0.2.12", - "opentelemetry 0.22.0", -] - [[package]] name = "opentelemetry-otlp" version = "0.14.0" @@ -1322,21 +1315,21 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.15.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" +checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76" dependencies = [ "async-trait", "futures-core", - "http 0.2.12", - "opentelemetry 0.22.0", - "opentelemetry-proto 0.5.0", - "opentelemetry-semantic-conventions 0.14.0", - "opentelemetry_sdk 0.22.1", - "prost 0.12.6", + "http 1.1.0", + "opentelemetry 0.27.1", + "opentelemetry-proto 0.27.0", + "opentelemetry_sdk 0.27.1", + "prost 0.13.5", "thiserror 1.0.69", "tokio", - "tonic 0.11.0", + "tonic 0.12.3", + "tracing", ] [[package]] @@ -1353,14 +1346,14 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.5.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" +checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ - "opentelemetry 0.22.0", - "opentelemetry_sdk 0.22.1", - "prost 0.12.6", - "tonic 0.11.0", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", + "prost 0.13.5", + "tonic 0.12.3", ] [[package]] @@ -1374,9 +1367,9 @@ dependencies = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.14.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" +checksum = "bc1b6902ff63b32ef6c489e8048c5e253e2e4a803ea3ea7e783914536eb15c52" [[package]] name = "opentelemetry_sdk" @@ -1403,24 +1396,39 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.22.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" +checksum = "d2c627d9f4c9cdc1f21a29ee4bfbd6028fcb8bcf2a857b43f3abdf72c9c862f3" dependencies = [ "async-trait", - "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", "glob", "once_cell", - "opentelemetry 0.22.0", - "ordered-float", + "opentelemetry 0.26.0", "percent-encoding", "rand", "thiserror 1.0.69", - "tokio", - "tokio-stream", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231e9d6ceef9b0b2546ddf52335785ce41252bc7474ee8ba05bfad277be13ab8" +dependencies = [ + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "opentelemetry 0.27.1", + "percent-encoding", + "rand", + "serde_json", + "thiserror 1.0.69", + "tracing", ] [[package]] @@ -1604,21 +1612,30 @@ dependencies = [ ] [[package]] -name = "prost-build" -version = "0.12.6" +name = "prost" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "heck 0.4.1", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck 0.5.0", "itertools 0.12.1", "log", "multimap", "once_cell", "petgraph", "prettyplease", - "prost 0.12.6", - "prost-types", + "prost 0.13.5", + "prost-types 0.13.5", "regex", "syn 2.0.89", "tempfile", @@ -1650,6 +1667,19 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "prost-types" version = "0.12.6" @@ -1659,6 +1689,15 @@ dependencies = [ "prost 0.12.6", ] +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost 0.13.5", +] + [[package]] name = "quote" version = "1.0.37" @@ -1704,7 +1743,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.13.0", ] [[package]] @@ -1762,7 +1801,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.31", @@ -1852,36 +1891,25 @@ dependencies = [ "anyhow", "async-trait", "gh-workflow", - "http-body-util", - "hyper 0.14.31", - "hyper-util", "once_cell", - "opentelemetry 0.22.0", - "opentelemetry-http 0.11.1", - "opentelemetry-otlp 0.15.0", - "opentelemetry-semantic-conventions 0.14.0", - "opentelemetry_sdk 0.22.1", - "prost 0.12.6", - "prost-types", + "opentelemetry 0.27.1", + "opentelemetry-otlp 0.27.0", + "opentelemetry-semantic-conventions 0.27.0", + "opentelemetry_sdk 0.27.1", + "prost 0.13.5", + "prost-types 0.13.5", "shuttle-axum", "shuttle-runtime 0.49.0", "tokio", - "tonic 0.11.0", + "tonic 0.12.3", "tonic-build", "tonic-reflection", "tonic-tracing-opentelemetry", - "tower 0.4.13", "tracing", - "tracing-opentelemetry 0.23.0", + "tracing-opentelemetry 0.28.0", "tracing-subscriber", ] -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - [[package]] name = "rustc-hash" version = "1.1.0" @@ -1894,7 +1922,7 @@ version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys", @@ -1915,26 +1943,26 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.4" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "log", + "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.13", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -1960,9 +1988,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -1976,9 +2007,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -2041,12 +2072,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.13.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2054,9 +2085,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -2241,7 +2272,7 @@ dependencies = [ "jsonwebtoken", "opentelemetry 0.21.0", "opentelemetry-appender-tracing", - "opentelemetry-http 0.10.0", + "opentelemetry-http", "opentelemetry-otlp 0.14.0", "opentelemetry_sdk 0.21.2", "pin-project", @@ -2279,7 +2310,7 @@ dependencies = [ "crossterm 0.27.0", "http 0.2.12", "opentelemetry 0.21.0", - "opentelemetry-http 0.10.0", + "opentelemetry-http", "pin-project", "reqwest", "semver", @@ -2307,7 +2338,7 @@ dependencies = [ "futures-core", "http 0.2.12", "prost 0.12.6", - "prost-types", + "prost-types 0.12.6", "shuttle-common 0.39.0", "tokio", "tonic 0.10.2", @@ -2323,7 +2354,7 @@ checksum = "132a015d70a737692569573320421d87c0fc3cf5696bf9f62451542ddbadf508" dependencies = [ "futures-core", "prost 0.12.6", - "prost-types", + "prost-types 0.12.6", "shuttle-common 0.49.0", "tonic 0.10.2", ] @@ -2337,7 +2368,7 @@ dependencies = [ "anyhow", "async-trait", "chrono", - "prost-types", + "prost-types 0.12.6", "serde", "serde_json", "shuttle-codegen 0.39.0", @@ -2472,6 +2503,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "spin" version = "0.9.8" @@ -2606,7 +2647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -2740,20 +2781,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ - "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio 1.2.1", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.4", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2768,9 +2808,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2789,12 +2829,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", + "rustls 0.23.41", "tokio", ] @@ -2849,11 +2888,11 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.31", - "hyper-timeout", + "hyper-timeout 0.4.1", "percent-encoding", "pin-project", "prost 0.11.9", @@ -2876,11 +2915,11 @@ dependencies = [ "axum 0.6.20", "base64 0.21.7", "bytes", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.31", - "hyper-timeout", + "hyper-timeout 0.4.1", "percent-encoding", "pin-project", "prost 0.12.6", @@ -2894,28 +2933,30 @@ dependencies = [ [[package]] name = "tonic" -version = "0.11.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", - "axum 0.6.20", - "base64 0.21.7", + "axum 0.7.9", + "base64 0.22.1", "bytes", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "hyper-timeout", + "h2 0.4.15", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.1", + "hyper-timeout 0.5.2", + "hyper-util", "percent-encoding", "pin-project", - "prost 0.12.6", + "prost 0.13.5", "rustls-native-certs", "rustls-pemfile 2.2.0", - "rustls-pki-types", + "socket2 0.5.8", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.4", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -2925,47 +2966,49 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.11.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" dependencies = [ "prettyplease", "proc-macro2", "prost-build", + "prost-types 0.13.5", "quote", "syn 2.0.89", ] [[package]] name = "tonic-reflection" -version = "0.11.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548c227bd5c0fae5925812c4ec6c66ffcfced23ea370cb823f4d18f0fc1cb6a7" +checksum = "878d81f52e7fcfd80026b7fdb6a9b578b3c3653ba987f87f0dce4b64043cba27" dependencies = [ - "prost 0.12.6", - "prost-types", + "prost 0.13.5", + "prost-types 0.13.5", "tokio", "tokio-stream", - "tonic 0.11.0", + "tonic 0.12.3", ] [[package]] name = "tonic-tracing-opentelemetry" -version = "0.18.2" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f7d16858362cbf0beac4aae1a1421afe89688ac9a5c17439e315c1a477b764" +checksum = "1aa8f4f019bd4c1c522afa7b96aff9b451865c700a60a385eb8bd42007a117a6" dependencies = [ "futures-core", "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "opentelemetry 0.22.0", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.5.1", + "opentelemetry 0.26.0", "pin-project-lite", - "tonic 0.11.0", - "tower 0.4.13", + "tonic 0.12.3", + "tower 0.5.1", "tracing", - "tracing-opentelemetry 0.23.0", + "tracing-opentelemetry 0.27.0", + "tracing-opentelemetry-instrumentation-sdk", ] [[package]] @@ -3010,7 +3053,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.13.0", "bytes", "futures-core", "futures-util", @@ -3099,14 +3142,14 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.23.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" +checksum = "dc58af5d3f6c5811462cabb3289aec0093f7338e367e5a33d28c0433b3c7360b" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.22.0", - "opentelemetry_sdk 0.22.1", + "opentelemetry 0.26.0", + "opentelemetry_sdk 0.26.0", "smallvec", "tracing", "tracing-core", @@ -3115,6 +3158,36 @@ dependencies = [ "web-time 1.1.0", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time 1.1.0", +] + +[[package]] +name = "tracing-opentelemetry-instrumentation-sdk" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e23ebe790a95c3105f5a7ec8e7c33884ecc8462f751f7f719d2356a3cfa122b" +dependencies = [ + "http 1.1.0", + "opentelemetry 0.26.0", + "tracing", + "tracing-opentelemetry 0.27.0", +] + [[package]] name = "tracing-serde" version = "0.2.0" @@ -3449,6 +3522,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" version = "0.48.0" @@ -3476,6 +3555,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.48.5" diff --git a/Cargo.toml b/Cargo.toml index dfa846a..6306858 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,37 +6,33 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -hyper = { version = "0.14.28", features = ["full"] } -tokio = { version = "1.36.0", features = ["full"] } -tonic = "0.11.0" -tonic-reflection = "0.11.0" -prost = "0.12.3" -prost-types = "0.12.3" -tower = "0.4.13" -hyper-util = { version = "0.1.3", features = ["tokio"] } -http-body-util = "0.1.0" -anyhow = "1.0.82" -once_cell = "1.19.0" -tonic-tracing-opentelemetry = "0.18.1" -opentelemetry = { version = "0.22.0", features = ["trace"] } -opentelemetry_sdk = { version = "0.22.1", features = ["trace", "rt-tokio"] } -opentelemetry-semantic-conventions = "0.14.0" -opentelemetry-http = "0.11.0" -opentelemetry-otlp = { version = "0.15.0", features = [ +tokio = { version = "1.43.0", features = ["full"] } +tonic = "0.12.3" +tonic-reflection = "0.12.3" +prost = "0.13.4" +prost-types = "0.13.4" +anyhow = "1.0.95" +once_cell = "1.20.2" +tonic-tracing-opentelemetry = "0.23.0" +opentelemetry = { version = "0.27.1", features = ["trace"] } +opentelemetry_sdk = { version = "0.27.1", features = ["trace"] } +opentelemetry-semantic-conventions = "0.27.0" +opentelemetry-otlp = { version = "0.27.0", features = [ + "grpc-tonic", "trace", # required to make grpc requests "tls-roots", ] } -tracing = "0.1.40" -tracing-opentelemetry = "0.23.0" -tracing-subscriber = "0.3.18" +tracing = "0.1.41" +tracing-opentelemetry = "0.28.0" +tracing-subscriber = "0.3.19" shuttle-runtime = "0.49.0" shuttle-axum = "0.39.0" -async-trait = "0.1" +async-trait = "0.1.83" [build-dependencies] -gh-workflow = "0.5.1" -tonic-build = "0.11.0" +gh-workflow = "0.5.3" +tonic-build = "0.12.3" [dev-dependencies] -gh-workflow = "0.5.1" +gh-workflow = "0.5.3" diff --git a/build.rs b/build.rs index 4f4fd27..710586a 100644 --- a/build.rs +++ b/build.rs @@ -9,6 +9,6 @@ fn main() { tonic_build::configure() .file_descriptor_set_path(out_dir.join("news_descriptor.bin")) - .compile(&["news.proto"], &["proto"]) + .compile_protos(&["news.proto"], &["proto"]) .unwrap(); } diff --git a/src/main.rs b/src/main.rs index 7e2aed4..8033ea9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,12 @@ use std::sync::{Arc, Mutex}; -use anyhow::{anyhow, Result}; -use hyper::{ - header::{HeaderName, HeaderValue}, - HeaderMap, -}; +use anyhow::Result; use once_cell::sync::Lazy; -use opentelemetry::{global, trace::TraceError, trace::TracerProvider, KeyValue}; -use opentelemetry_otlp::WithExportConfig; -use opentelemetry_sdk::{propagation::TraceContextPropagator, runtime, Resource}; +use opentelemetry::{global, trace::TracerProvider as _, KeyValue}; +use opentelemetry_otlp::{SpanExporter, WithExportConfig, WithTonicConfig}; +use opentelemetry_sdk::{propagation::TraceContextPropagator, trace::SdkTracerProvider, Resource}; use tonic::{metadata::MetadataMap, transport::Server as TonicServer, Response, Status}; use tonic_tracing_opentelemetry::middleware::server; -use tower::make::Shared; use news::news_service_server::NewsService; use news::news_service_server::NewsServiceServer; @@ -165,41 +160,40 @@ impl NewsService for MyNewsService { } static RESOURCE: Lazy = Lazy::new(|| { - Resource::default().merge(&Resource::new(vec![ - KeyValue::new( - opentelemetry_semantic_conventions::resource::SERVICE_NAME, - "rust-grpc", - ), - KeyValue::new( - opentelemetry_semantic_conventions::resource::SERVICE_VERSION, - "test", - ), - ])) + Resource::builder() + .with_attributes([ + KeyValue::new( + opentelemetry_semantic_conventions::attribute::SERVICE_NAME, + "rust-grpc", + ), + KeyValue::new( + opentelemetry_semantic_conventions::attribute::SERVICE_VERSION, + "test", + ), + ]) + .build() }); fn init_tracer() -> Result<()> { global::set_text_map_propagator(TraceContextPropagator::new()); static TELEMETRY_URL: &str = "https://api.honeycomb.io:443"; - let headers = HeaderMap::from_iter([( - HeaderName::from_static("x-honeycomb-team"), - HeaderValue::from_str(&std::env::var("HONEYCOMB_API_KEY")?)?, - )]); - - let otlp_exporter = opentelemetry_otlp::new_exporter() - .tonic() + let mut metadata = MetadataMap::new(); + metadata.insert( + "x-honeycomb-team", + std::env::var("HONEYCOMB_API_KEY")?.parse()?, + ); + + let exporter = SpanExporter::builder() + .with_tonic() .with_endpoint(TELEMETRY_URL) - .with_metadata(MetadataMap::from_headers(headers)); - - let provider = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter(otlp_exporter) - .with_trace_config(opentelemetry_sdk::trace::config().with_resource(RESOURCE.clone())) - .install_batch(runtime::Tokio)? - .provider() - .ok_or(TraceError::Other( - anyhow!("Failed to instantiate OTLP provider").into(), - ))?; + .with_metadata(metadata) + .build()?; + + let provider = SdkTracerProvider::builder() + .with_batch_exporter(exporter) + .with_resource(RESOURCE.clone()) + .build(); let tracer = provider.tracer("tracing"); let trace_layer = tracing_opentelemetry::layer() @@ -232,20 +226,16 @@ impl Service for MyNewsService { async fn bind(mut self, addr: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { let service = tonic_reflection::server::Builder::configure() .register_encoded_file_descriptor_set(news::FILE_DESCRIPTOR_SET) - .build() + .build_v1() .unwrap(); println!("NewsService server listening on {}", addr); - let tonic_service = TonicServer::builder() + TonicServer::builder() .layer(server::OtelGrpcLayer::default()) .add_service(NewsServiceServer::new(self)) .add_service(service) - .into_service(); - let make_svc = Shared::new(tonic_service); - - let server = hyper::Server::bind(&addr).serve(make_svc); - server + .serve(addr) .await .map_err(|e| shuttle_runtime::Error::Custom(anyhow::anyhow!(e)))?; diff --git a/tests/news.rs b/tests/news.rs new file mode 100644 index 0000000..d3deb5c --- /dev/null +++ b/tests/news.rs @@ -0,0 +1,101 @@ +use prost::Message; +use tonic_reflection::server::Builder as ReflectionBuilder; + +pub mod news { + tonic::include_proto!("news"); // The package name specified in your .proto + pub(crate) const FILE_DESCRIPTOR_SET: &[u8] = + tonic::include_file_descriptor_set!("news_descriptor"); +} + +use news::{News, NewsId, NewsList}; + +// Round-trips a proto message through the prost codec generated by the upgraded +// prost/tonic-build toolchain. Encoding and decoding back must be lossless. +#[test] +fn proto_roundtrip() { + let news = News { + id: 7, + title: "Note 7".into(), + body: "Content 7".into(), + post_image: "Post image 7".into(), + status: 1, + }; + + let mut buf = Vec::new(); + news.encode(&mut buf).unwrap(); + let decoded = News::decode(buf.as_slice()).unwrap(); + + assert_eq!(news, decoded); +} + +// Default / empty-field message must survive the round-trip too: proto3 omits +// zero-valued fields on the wire, so an all-default message encodes to no bytes +// and decodes back to the same default value. +#[test] +fn proto_roundtrip_default() { + let empty = News::default(); + + let mut buf = Vec::new(); + empty.encode(&mut buf).unwrap(); + assert!(buf.is_empty()); + + let decoded = News::decode(buf.as_slice()).unwrap(); + assert_eq!(empty, decoded); +} + +// Nested repeated messages (NewsList { news: [...] }) must round-trip, exercising +// the repeated-field codegen of the upgraded toolchain. +#[test] +fn news_list_roundtrip() { + let list = NewsList { + news: vec![ + News { + id: 1, + title: "Note 1".into(), + body: "Content 1".into(), + post_image: "Post image 1".into(), + status: 0, + }, + News { + id: 2, + title: "Note 2".into(), + body: "Content 2".into(), + post_image: "Post image 2".into(), + status: 1, + }, + ], + }; + + let mut buf = Vec::new(); + list.encode(&mut buf).unwrap(); + let decoded = NewsList::decode(buf.as_slice()).unwrap(); + + assert_eq!(list, decoded); + assert_eq!(decoded.news.len(), 2); + assert_eq!(decoded.news[1].id, 2); +} + +// The reflection service is registered in `bind` via the v1 builder API +// (`build_v1`) introduced by the upgraded tonic-reflection. Building it from the +// generated descriptor set must succeed without panicking, proving the embedded +// `news_descriptor` is valid and the new API path is wired correctly. +#[test] +fn reflection_descriptor_builds_v1() { + ReflectionBuilder::configure() + .register_encoded_file_descriptor_set(news::FILE_DESCRIPTOR_SET) + .build_v1() + .unwrap(); +} + +// Sanity-check a scalar request type used by the service so the generated module +// is exercised end-to-end (not just the message structs above). +#[test] +fn news_id_roundtrip() { + let id = NewsId { id: 42 }; + + let mut buf = Vec::new(); + id.encode(&mut buf).unwrap(); + let decoded = NewsId::decode(buf.as_slice()).unwrap(); + + assert_eq!(decoded.id, 42); +}