From 0ddfb854401c6dabd003b786c54d1ccb8b19ca05 Mon Sep 17 00:00:00 2001 From: WenyXu Date: Thu, 20 Feb 2025 06:09:12 +0000 Subject: [PATCH 1/2] feat: enable gzip for prometheus query handlers and ignore nan values in prometheus response --- src/servers/src/http.rs | 2 ++ .../src/http/result/prometheus_resp.rs | 34 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/servers/src/http.rs b/src/servers/src/http.rs index 02652ea1e71f..2e741fa9fc8d 100644 --- a/src/servers/src/http.rs +++ b/src/servers/src/http.rs @@ -43,6 +43,7 @@ use snafu::{ensure, ResultExt}; use tokio::sync::oneshot::{self, Sender}; use tokio::sync::Mutex; use tower::ServiceBuilder; +use tower_http::compression::CompressionLayer; use tower_http::cors::{AllowOrigin, Any, CorsLayer}; use tower_http::decompression::RequestDecompressionLayer; use tower_http::trace::TraceLayer; @@ -990,6 +991,7 @@ impl HttpServer { "/label/{label_name}/values", routing::get(label_values_query), ) + .layer(ServiceBuilder::new().layer(CompressionLayer::new().gzip(true))) .with_state(prometheus_handler) } diff --git a/src/servers/src/http/result/prometheus_resp.rs b/src/servers/src/http/result/prometheus_resp.rs index eb076f88baee..d35ef8ce97e2 100644 --- a/src/servers/src/http/result/prometheus_resp.rs +++ b/src/servers/src/http/result/prometheus_resp.rs @@ -264,23 +264,29 @@ impl PrometheusJsonResponse { // assemble rows for row_index in 0..batch.num_rows() { - // retrieve tags - // TODO(ruihang): push table name `__metric__` - let mut tags = Vec::with_capacity(num_label_columns + 1); - tags.push(metric_name); - for (tag_column, tag_name) in tag_columns.iter().zip(tag_names.iter()) { - // TODO(ruihang): add test for NULL tag - if let Some(tag_value) = tag_column.get_data(row_index) { - tags.push((tag_name, tag_value)); + // retrieve value + if let Some(v) = field_column.get_data(row_index) { + // ignore all NaN values to reduce the amount of data to be sent. + if v.is_nan() { + continue; } - } - // retrieve timestamp - let timestamp_millis: i64 = timestamp_column.get_data(row_index).unwrap().into(); - let timestamp = timestamp_millis as f64 / 1000.0; + // retrieve tags + // TODO(ruihang): push table name `__metric__` + let mut tags = Vec::with_capacity(num_label_columns + 1); + tags.push(metric_name); + for (tag_column, tag_name) in tag_columns.iter().zip(tag_names.iter()) { + // TODO(ruihang): add test for NULL tag + if let Some(tag_value) = tag_column.get_data(row_index) { + tags.push((tag_name, tag_value)); + } + } + + // retrieve timestamp + let timestamp_millis: i64 = + timestamp_column.get_data(row_index).unwrap().into(); + let timestamp = timestamp_millis as f64 / 1000.0; - // retrieve value - if let Some(v) = field_column.get_data(row_index) { buffer .entry(tags) .or_default() From 2a02e94a68c109708b0834ad23b7d9f64b9cd58c Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Thu, 20 Feb 2025 17:33:28 +0800 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: shuiyisong <113876041+shuiyisong@users.noreply.github.com> --- src/servers/src/http.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/src/http.rs b/src/servers/src/http.rs index 2e741fa9fc8d..6461bcfb5526 100644 --- a/src/servers/src/http.rs +++ b/src/servers/src/http.rs @@ -991,7 +991,7 @@ impl HttpServer { "/label/{label_name}/values", routing::get(label_values_query), ) - .layer(ServiceBuilder::new().layer(CompressionLayer::new().gzip(true))) + .layer(ServiceBuilder::new().layer(CompressionLayer::new())) .with_state(prometheus_handler) }