From 211be1e2d23a99faf93a2688030b7af932a2ffd3 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Thu, 20 Feb 2025 16:15:44 +0100 Subject: [PATCH 1/7] feat: Add simple web-based dashboard for cluster states --- trino-lb-core/src/trino_cluster.rs | 16 ++++- trino-lb/Cargo.toml | 1 + trino-lb/src/cluster_group_manager.rs | 85 +++++++++++++++++++-------- trino-lb/src/http_server/mod.rs | 2 + trino-lb/src/http_server/ui/index.rs | 83 ++++++++++++++++++++++++++ trino-lb/src/http_server/ui/mod.rs | 1 + 6 files changed, 164 insertions(+), 24 deletions(-) create mode 100644 trino-lb/src/http_server/ui/index.rs diff --git a/trino-lb-core/src/trino_cluster.rs b/trino-lb-core/src/trino_cluster.rs index 7a5c1cd..8bf4cef 100644 --- a/trino-lb-core/src/trino_cluster.rs +++ b/trino-lb-core/src/trino_cluster.rs @@ -1,4 +1,4 @@ -use std::time::SystemTime; +use std::{fmt::Display, time::SystemTime}; use serde::{Deserialize, Serialize}; use strum::IntoStaticStr; @@ -23,6 +23,20 @@ pub enum ClusterState { Deactivated, } +impl Display for ClusterState { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ClusterState::Unknown => f.write_str("Unknown"), + ClusterState::Stopped => f.write_str("Stopped"), + ClusterState::Starting => f.write_str("Starting"), + ClusterState::Ready => f.write_str("Ready"), + ClusterState::Draining { .. } => f.write_str("Draining"), + ClusterState::Terminating => f.write_str("Terminating"), + ClusterState::Deactivated => f.write_str("Deactivated"), + } + } +} + impl ClusterState { pub fn start(&self) -> Self { match self { diff --git a/trino-lb/Cargo.toml b/trino-lb/Cargo.toml index 2bfa981..f52c8df 100644 --- a/trino-lb/Cargo.toml +++ b/trino-lb/Cargo.toml @@ -22,6 +22,7 @@ clap.workspace = true enum_dispatch.workspace = true futures.workspace = true http.workspace = true +indoc.workspace = true k8s-openapi.workspace = true kube.workspace = true main_error.workspace = true diff --git a/trino-lb/src/cluster_group_manager.rs b/trino-lb/src/cluster_group_manager.rs index 75399a0..c97561a 100644 --- a/trino-lb/src/cluster_group_manager.rs +++ b/trino-lb/src/cluster_group_manager.rs @@ -13,7 +13,7 @@ use tracing::{debug, instrument}; use tracing_opentelemetry::OpenTelemetrySpanExt; use trino_lb_core::{ config::Config, sanitization::Sanitize, trino_api::TrinoQueryApiResponse, - trino_query::TrinoQuery, + trino_cluster::ClusterState, trino_query::TrinoQuery, }; use trino_lb_persistence::{Persistence, PersistenceImplementation}; use url::Url; @@ -72,13 +72,19 @@ pub struct ClusterGroupManager { http_client: Client, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Hash, Eq, PartialEq)] pub struct TrinoCluster { pub name: String, pub max_running_queries: u64, pub endpoint: Url, } +#[derive(Clone, Debug)] +pub struct ClusterStats { + pub state: ClusterState, + pub query_counter: u64, +} + pub enum SendToTrinoResponse { HandedOver { trino_query_api_response: TrinoQueryApiResponse, @@ -251,13 +257,32 @@ impl ClusterGroupManager { Ok(()) } - /// Tries to find the best cluster from the specified `cluster_group`. If all clusters of the requested group have reached their - /// configured query limit, this function returns [`None`]. + /// Tries to find the best cluster from the specified `cluster_group`. If all clusters of the requested group have + /// reached their configured query limit, this function returns [`None`]. #[instrument(skip(self))] pub async fn try_find_best_cluster_for_group( &self, cluster_group: &str, ) -> Result, Error> { + let cluster_stats = self + .get_cluster_stats_for_cluster_group(cluster_group) + .await?; + + let cluster_with_min_queries = cluster_stats + .into_iter() + .filter(|(cluster, stats)| stats.query_counter < cluster.max_running_queries) + .min_by_key(|(_, stats)| stats.query_counter) + .map(|(cluster, _)| cluster); + + Ok(cluster_with_min_queries) + } + + /// Collect statistics (such as state and query counter) for all Trino clusters in a given clusterGroup + #[instrument(skip(self))] + pub async fn get_cluster_stats_for_cluster_group( + &self, + cluster_group: &str, + ) -> Result, Error> { let clusters = self .groups .get(cluster_group) @@ -273,13 +298,6 @@ impl ClusterGroupManager { .await .context(ReadCurrentClusterStateForClusterGroupFromPersistenceSnafu { cluster_group })?; - let clusters = clusters - .iter() - .zip(cluster_states) - .filter(|(_, state)| state.ready_to_accept_queries()) - .map(|(c, _)| c) - .collect::>(); - let cluster_query_counters = try_join_all( clusters .iter() @@ -288,21 +306,42 @@ impl ClusterGroupManager { .await .context(GetQueryCounterForGroupSnafu { cluster_group })?; - let debug_output = clusters + let cluster_stats = clusters .iter() - .map(|c| &c.name) - .zip(cluster_query_counters.iter()) - .collect::>(); - debug!(query_counters = ?debug_output, "Clusters had the following query counters"); - - let cluster_with_min_queries = clusters - .into_iter() + .zip(cluster_states) .zip(cluster_query_counters) - .filter(|(cluster, counter)| *counter < cluster.max_running_queries) - .min_by_key(|(_, counter)| *counter) - .map(|(c, _)| c); + .map(|((trino_cluster, state), query_counter)| { + ( + trino_cluster, + ClusterStats { + state, + query_counter, + }, + ) + }) + .collect(); + + debug!(?cluster_stats, "Clusters had the following stats"); + + Ok(cluster_stats) + } - Ok(cluster_with_min_queries) + /// Get the stats for all clusters, regardless the cluster group membership + pub async fn get_all_cluster_stats( + &self, + ) -> Result, Error> { + let cluster_stats = try_join_all( + self.groups + .keys() + .map(|cluster_group| self.get_cluster_stats_for_cluster_group(cluster_group)), + ) + .await?; + + let mut all_cluster_stats = HashMap::new(); + for cluster_stat in cluster_stats { + all_cluster_stats.extend(cluster_stat); + } + Ok(all_cluster_stats) } } diff --git a/trino-lb/src/http_server/mod.rs b/trino-lb/src/http_server/mod.rs index bfde769..c51c3d8 100644 --- a/trino-lb/src/http_server/mod.rs +++ b/trino-lb/src/http_server/mod.rs @@ -94,6 +94,7 @@ pub async fn start_http_server( }); let app = Router::new() + .route("/", get(|| async { Redirect::permanent("/ui/index.html") })) .route("/v1/statement", post(v1::statement::post_statement)) .route( "/v1/statement/queued_in_trino_lb/{query_id}/{sequence_number}", @@ -119,6 +120,7 @@ pub async fn start_http_server( "/v1/statement/executing/{query_id}/{slug}/{token}", delete(v1::statement::delete_trino_executing_statement), ) + .route("/ui/index.html", get(ui::index::get_ui_index)) .route("/ui/query.html", get(ui::query::get_ui_query)) .with_state(app_state); diff --git a/trino-lb/src/http_server/ui/index.rs b/trino-lb/src/http_server/ui/index.rs new file mode 100644 index 0000000..eb3bc4b --- /dev/null +++ b/trino-lb/src/http_server/ui/index.rs @@ -0,0 +1,83 @@ +use std::{collections::BTreeMap, sync::Arc}; + +use axum::{ + extract::State, + response::{Html, IntoResponse, Response}, +}; +use http::StatusCode; +use indoc::{formatdoc, indoc}; +use opentelemetry::KeyValue; +use snafu::{ResultExt, Snafu}; +use tracing::{instrument, warn}; + +use crate::{cluster_group_manager, http_server::AppState}; + +#[derive(Snafu, Debug)] +pub enum Error { + #[snafu(display("Failed to get all cluster states"))] + GetAllClusterStates { + source: cluster_group_manager::Error, + }, +} + +impl IntoResponse for Error { + fn into_response(self) -> Response { + warn!(error = ?self, "Error while processing ui query request"); + let status_code = match self { + Error::GetAllClusterStates { .. } => StatusCode::INTERNAL_SERVER_ERROR, + }; + (status_code, format!("{self}")).into_response() + } +} + +/// Show some information to the user about the query state +#[instrument(name = "GET /ui/index.html", skip(state))] +pub async fn get_ui_index(State(state): State>) -> Result, Error> { + state + .metrics + .http_counter + .add(1, &[KeyValue::new("resource", "get_ui_index")]); + + let cluster_stats = state + .cluster_group_manager + .get_all_cluster_stats() + .await + .context(GetAllClusterStatesSnafu)?; + + // Sort the clusters alphabetically + let cluster_stats: BTreeMap<_, _> = cluster_stats + .into_iter() + .map(|(cluster, stats)| (&cluster.name, stats)) + .collect(); + + let mut html: String = indoc! {" +

Cluster stats

+
+ + + + + + + "} + .to_owned(); + + for (cluster, stats) in cluster_stats { + html.push_str(&formatdoc! {" + + + + + + ", + state = stats.state, + query_counter = stats.query_counter, + }); + } + + html.push_str(indoc! {" +
ClusterStateQuery counter
{cluster}{state}{query_counter}
+ "}); + + Ok(Html(html)) +} diff --git a/trino-lb/src/http_server/ui/mod.rs b/trino-lb/src/http_server/ui/mod.rs index 67350db..4ae84d9 100644 --- a/trino-lb/src/http_server/ui/mod.rs +++ b/trino-lb/src/http_server/ui/mod.rs @@ -1 +1,2 @@ +pub mod index; pub mod query; From 28c220ae730959aea9f2d1d3dc55e92d00d120dc Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Fri, 21 Feb 2025 13:56:05 +0100 Subject: [PATCH 2/7] changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be1d354..fe11d4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Add simple web-based dashboard that shows the current state and query counts of all clusters. + This makes it easier to debug state transitions of clusters ([#62]). + ### Changed - Set defaults to oci ([#57]). @@ -13,6 +18,7 @@ All notable changes to this project will be documented in this file. - Reduce max poll delay from 10s to 3s to have better client responsiveness [#57]: https://github.com/stackabletech/trino-lb/pull/57 +[#62]: https://github.com/stackabletech/trino-lb/pull/62 ## [0.3.2] - 2024-08-20 From f6e5e759d6a1e9946cc25ae6e15980b2d08bf0e5 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Fri, 21 Feb 2025 15:13:38 +0100 Subject: [PATCH 3/7] fix: Only hand queries to clusters that are able to accept queries --- trino-lb/src/cluster_group_manager.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/trino-lb/src/cluster_group_manager.rs b/trino-lb/src/cluster_group_manager.rs index c97561a..126fde9 100644 --- a/trino-lb/src/cluster_group_manager.rs +++ b/trino-lb/src/cluster_group_manager.rs @@ -270,7 +270,11 @@ impl ClusterGroupManager { let cluster_with_min_queries = cluster_stats .into_iter() + // Only send queries to clusters that are actually able to accept them + .filter(|(_, stats)| stats.state.ready_to_accept_queries()) + // Only send queries to clusters that are not already full .filter(|(cluster, stats)| stats.query_counter < cluster.max_running_queries) + // Pick the emptiest cluster .min_by_key(|(_, stats)| stats.query_counter) .map(|(cluster, _)| cluster); From 76a29ea33c8edd6e46d7a1f4f2f5499316435afd Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Mon, 24 Feb 2025 11:28:02 +0100 Subject: [PATCH 4/7] fix bug --- trino-lb-core/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trino-lb-core/src/config.rs b/trino-lb-core/src/config.rs index 767a9a5..b61cf11 100644 --- a/trino-lb-core/src/config.rs +++ b/trino-lb-core/src/config.rs @@ -137,7 +137,7 @@ impl Default for TrinoLbPortsConfig { #[derive(Clone, Debug, Deserialize)] #[serde(deny_unknown_fields, rename_all = "camelCase")] pub enum PersistenceConfig { - InMemory, + InMemory {}, Redis(RedisConfig), Postgres(PostgresConfig), } From 800db29082a613b324049489462dba91205d0c58 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Mon, 24 Feb 2025 11:29:20 +0100 Subject: [PATCH 5/7] Use askama --- Cargo.lock | 266 ++++++++++++++++++--------- Cargo.toml | 1 + trino-lb/Cargo.toml | 1 + trino-lb/src/http_server/ui/index.rs | 54 +++--- trino-lb/templates/index.html | 16 ++ 5 files changed, 220 insertions(+), 118 deletions(-) create mode 100644 trino-lb/templates/index.html diff --git a/Cargo.lock b/Cargo.lock index ccdc55b..8e2f0f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" [[package]] name = "arc-swap" @@ -122,6 +122,50 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "askama" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" +dependencies = [ + "askama_derive", + "askama_escape", + "humansize", + "num-traits", + "percent-encoding", +] + +[[package]] +name = "askama_derive" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" +dependencies = [ + "askama_parser", + "basic-toml", + "mime", + "mime_guess", + "proc-macro2", + "quote", + "serde", + "syn", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_parser" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" +dependencies = [ + "nom", +] + [[package]] name = "async-broadcast" version = "0.7.2" @@ -317,7 +361,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "pin-project-lite", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "rustls-pki-types", "tokio", @@ -339,9 +383,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7" +checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d" dependencies = [ "fastrand", ] @@ -379,6 +423,15 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "basic-toml" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" +dependencies = [ + "serde", +] + [[package]] name = "bigdecimal" version = "0.3.1" @@ -443,9 +496,9 @@ checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.2.12" +version = "1.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" dependencies = [ "shlex", ] @@ -501,9 +554,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.28" +version = "4.5.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" dependencies = [ "clap_builder", "clap_derive", @@ -511,9 +564,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" dependencies = [ "anstream", "anstyle", @@ -770,9 +823,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" dependencies = [ "litrs", ] @@ -797,9 +850,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" dependencies = [ "serde", ] @@ -853,9 +906,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" @@ -907,9 +960,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -1121,9 +1174,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", @@ -1322,6 +1375,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + [[package]] name = "humantime" version = "2.1.0" @@ -1371,7 +1433,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.7", + "h2 0.4.8", "http 1.2.0", "http-body 1.0.1", "httparse", @@ -1428,7 +1490,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "log", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -1711,9 +1773,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -1818,7 +1880,7 @@ dependencies = [ "k8s-openapi", "kube-core", "pem", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "secrecy", "serde", @@ -1889,9 +1951,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libm" @@ -1939,9 +2001,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "main_error" @@ -2001,11 +2063,27 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] @@ -2021,6 +2099,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2278,9 +2366,9 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ "base64 0.22.1", "serde", @@ -2499,9 +2587,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", "prost-derive", @@ -2509,12 +2597,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn", @@ -2652,7 +2740,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.22", + "rustls 0.23.23", "socket2", "thiserror 2.0.11", "tokio", @@ -2670,7 +2758,7 @@ dependencies = [ "rand 0.8.5", "ring", "rustc-hash", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pki-types", "slab", "thiserror 2.0.11", @@ -2681,9 +2769,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" dependencies = [ "cfg_aliases", "libc", @@ -2720,8 +2808,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.0", - "zerocopy 0.8.17", + "rand_core 0.9.2", + "zerocopy 0.8.20", ] [[package]] @@ -2741,7 +2829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.0", + "rand_core 0.9.2", ] [[package]] @@ -2755,12 +2843,12 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" +checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.17", + "zerocopy 0.8.20", ] [[package]] @@ -2783,7 +2871,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rand 0.8.5", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-native-certs 0.7.3", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -2798,9 +2886,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ "bitflags 2.8.0", ] @@ -2923,7 +3011,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -2945,15 +3033,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3056,9 +3143,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "log", "once_cell", @@ -3232,9 +3319,9 @@ checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -3251,9 +3338,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -3262,9 +3349,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -3386,9 +3473,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" dependencies = [ "serde", ] @@ -3479,7 +3566,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -3777,9 +3864,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.16.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand", @@ -3940,7 +4027,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.22", + "rustls 0.23.23", "tokio", ] @@ -3977,9 +4064,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap 2.7.1", "toml_datetime", @@ -3997,7 +4084,7 @@ dependencies = [ "axum 0.7.9", "base64 0.22.1", "bytes", - "h2 0.4.7", + "h2 0.4.8", "http 1.2.0", "http-body 1.0.1", "http-body-util", @@ -4178,6 +4265,7 @@ dependencies = [ name = "trino-lb" version = "0.3.2" dependencies = [ + "askama", "axum 0.8.1", "axum-server", "chrono", @@ -4284,9 +4372,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" @@ -4294,6 +4382,12 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -4302,9 +4396,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-normalization" @@ -4383,9 +4477,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" +checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" dependencies = [ "getrandom 0.3.1", "serde", @@ -4776,9 +4870,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" dependencies = [ "memchr", ] @@ -4850,11 +4944,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.17" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" dependencies = [ - "zerocopy-derive 0.8.17", + "zerocopy-derive 0.8.20", ] [[package]] @@ -4870,9 +4964,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.17" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 35eff2e..1cafc03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ edition = "2021" repository = "https://github.com/stackabletech/trino-lb" [workspace.dependencies] +askama = "0.12" axum = { version = "0.8", features = ["tracing"] } # If we use the feature "tls-rustls" it will pull in the "aws-lc-rs" crate, which as of 2024-08-16 I did not get to build in the "make run-dev" workflow :/ axum-server = { version = "0.7", features = ["tls-rustls-no-provider"] } diff --git a/trino-lb/Cargo.toml b/trino-lb/Cargo.toml index f52c8df..b96a0c2 100644 --- a/trino-lb/Cargo.toml +++ b/trino-lb/Cargo.toml @@ -15,6 +15,7 @@ default-run = "trino-lb" trino-lb-core = { path = "../trino-lb-core" } trino-lb-persistence = { path = "../trino-lb-persistence" } +askama.workspace = true axum-server.workspace = true axum.workspace = true chrono.workspace = true diff --git a/trino-lb/src/http_server/ui/index.rs b/trino-lb/src/http_server/ui/index.rs index eb3bc4b..984b867 100644 --- a/trino-lb/src/http_server/ui/index.rs +++ b/trino-lb/src/http_server/ui/index.rs @@ -1,16 +1,19 @@ use std::{collections::BTreeMap, sync::Arc}; +use askama::Template; use axum::{ extract::State, response::{Html, IntoResponse, Response}, }; use http::StatusCode; -use indoc::{formatdoc, indoc}; use opentelemetry::KeyValue; use snafu::{ResultExt, Snafu}; use tracing::{instrument, warn}; -use crate::{cluster_group_manager, http_server::AppState}; +use crate::{ + cluster_group_manager::{self, ClusterStats}, + http_server::AppState, +}; #[derive(Snafu, Debug)] pub enum Error { @@ -18,6 +21,9 @@ pub enum Error { GetAllClusterStates { source: cluster_group_manager::Error, }, + + #[snafu(display("Failed to render template"))] + RenderTemplate { source: askama::Error }, } impl IntoResponse for Error { @@ -25,11 +31,18 @@ impl IntoResponse for Error { warn!(error = ?self, "Error while processing ui query request"); let status_code = match self { Error::GetAllClusterStates { .. } => StatusCode::INTERNAL_SERVER_ERROR, + Error::RenderTemplate { .. } => StatusCode::INTERNAL_SERVER_ERROR, }; (status_code, format!("{self}")).into_response() } } +#[derive(Template)] +#[template(path = "index.html")] +struct IndexTemplate<'a> { + cluster_stats: &'a BTreeMap<&'a String, ClusterStats>, +} + /// Show some information to the user about the query state #[instrument(name = "GET /ui/index.html", skip(state))] pub async fn get_ui_index(State(state): State>) -> Result, Error> { @@ -50,34 +63,11 @@ pub async fn get_ui_index(State(state): State>) -> ResultCluster stats -
- - - - - - - "} - .to_owned(); - - for (cluster, stats) in cluster_stats { - html.push_str(&formatdoc! {" - - - - - - ", - state = stats.state, - query_counter = stats.query_counter, - }); - } - - html.push_str(indoc! {" -
ClusterStateQuery counter
{cluster}{state}{query_counter}
- "}); - - Ok(Html(html)) + let index = IndexTemplate { + cluster_stats: &cluster_stats, + }; + index + .render() + .context(RenderTemplateSnafu) + .map(|html| Html(html)) } diff --git a/trino-lb/templates/index.html b/trino-lb/templates/index.html new file mode 100644 index 0000000..327123f --- /dev/null +++ b/trino-lb/templates/index.html @@ -0,0 +1,16 @@ +

Cluster stats

+ + + + + + + + {% for entry in cluster_stats %} + + + + + + {% endfor %} +
ClusterStateQuery counter
{{entry.0}}{{entry.1.state}}{{entry.1.query_counter}}
From b795fca6e55e73297f0007d49c812bc87a863239 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Mon, 24 Feb 2025 12:02:17 +0100 Subject: [PATCH 6/7] clippy --- trino-lb/src/http_server/ui/index.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/trino-lb/src/http_server/ui/index.rs b/trino-lb/src/http_server/ui/index.rs index 984b867..23378cd 100644 --- a/trino-lb/src/http_server/ui/index.rs +++ b/trino-lb/src/http_server/ui/index.rs @@ -66,8 +66,5 @@ pub async fn get_ui_index(State(state): State>) -> Result Date: Mon, 24 Feb 2025 15:17:50 +0100 Subject: [PATCH 7/7] Restore Cargo.lock to work around https://github.com/kube-rs/kube/issues/1700 --- Cargo.lock | 171 +++++++++++++++++++++++++++-------------------------- 1 file changed, 86 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e2f0f3..0203e4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arc-swap" @@ -361,7 +361,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "pin-project-lite", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-pemfile 2.2.0", "rustls-pki-types", "tokio", @@ -383,9 +383,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.4.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d" +checksum = "ba5289ec98f68f28dd809fd601059e6aa908bb8f6108620930828283d4ee23d7" dependencies = [ "fastrand", ] @@ -496,9 +496,9 @@ checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.2.15" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ "shlex", ] @@ -554,9 +554,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.30" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -564,9 +564,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.30" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -823,9 +823,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" dependencies = [ "litrs", ] @@ -850,9 +850,9 @@ dependencies = [ [[package]] name = "either" -version = "1.14.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" dependencies = [ "serde", ] @@ -906,9 +906,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" @@ -960,9 +960,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.1.0" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1174,9 +1174,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -1433,7 +1433,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.8", + "h2 0.4.7", "http 1.2.0", "http-body 1.0.1", "httparse", @@ -1490,7 +1490,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "log", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -1773,9 +1773,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.14.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -1880,7 +1880,7 @@ dependencies = [ "k8s-openapi", "kube-core", "pem", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-pemfile 2.2.0", "secrecy", "serde", @@ -1951,9 +1951,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.170" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" @@ -2001,9 +2001,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "main_error" @@ -2081,9 +2081,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -2366,9 +2366,9 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.5" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ "base64 0.22.1", "serde", @@ -2587,9 +2587,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.5" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", "prost-derive", @@ -2597,12 +2597,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.5" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2", "quote", "syn", @@ -2740,7 +2740,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.23", + "rustls 0.23.22", "socket2", "thiserror 2.0.11", "tokio", @@ -2758,7 +2758,7 @@ dependencies = [ "rand 0.8.5", "ring", "rustc-hash", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-pki-types", "slab", "thiserror 2.0.11", @@ -2769,9 +2769,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.10" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ "cfg_aliases", "libc", @@ -2808,8 +2808,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.2", - "zerocopy 0.8.20", + "rand_core 0.9.0", + "zerocopy 0.8.17", ] [[package]] @@ -2829,7 +2829,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.2", + "rand_core 0.9.0", ] [[package]] @@ -2843,12 +2843,12 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" +checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.20", + "zerocopy 0.8.17", ] [[package]] @@ -2871,7 +2871,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rand 0.8.5", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-native-certs 0.7.3", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -2886,9 +2886,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.8.0", ] @@ -3011,7 +3011,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -3033,14 +3033,15 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.11" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", + "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3143,9 +3144,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" dependencies = [ "log", "once_cell", @@ -3319,9 +3320,9 @@ checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -3338,9 +3339,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -3349,9 +3350,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -3473,9 +3474,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" dependencies = [ "serde", ] @@ -3566,7 +3567,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rustls 0.23.23", + "rustls 0.23.22", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -3864,9 +3865,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.17.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", @@ -4027,7 +4028,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.23", + "rustls 0.23.22", "tokio", ] @@ -4064,9 +4065,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ "indexmap 2.7.1", "toml_datetime", @@ -4084,7 +4085,7 @@ dependencies = [ "axum 0.7.9", "base64 0.22.1", "bytes", - "h2 0.4.8", + "h2 0.4.7", "http 1.2.0", "http-body 1.0.1", "http-body-util", @@ -4372,9 +4373,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.18.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" @@ -4396,9 +4397,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-normalization" @@ -4477,9 +4478,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.14.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ "getrandom 0.3.1", "serde", @@ -4870,9 +4871,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" dependencies = [ "memchr", ] @@ -4944,11 +4945,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.20" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" dependencies = [ - "zerocopy-derive 0.8.20", + "zerocopy-derive 0.8.17", ] [[package]] @@ -4964,9 +4965,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.20" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" dependencies = [ "proc-macro2", "quote",