From 6de519bd0a9dc6b263aa9f04e92aa26947d54cd1 Mon Sep 17 00:00:00 2001 From: WenyXu Date: Sat, 25 Jan 2025 02:47:39 +0000 Subject: [PATCH 1/2] chore: avoid necessary cloning --- .../src/http/result/prometheus_resp.rs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/servers/src/http/result/prometheus_resp.rs b/src/servers/src/http/result/prometheus_resp.rs index d4ab0480dabf..1a4c333d29cc 100644 --- a/src/servers/src/http/result/prometheus_resp.rs +++ b/src/servers/src/http/result/prometheus_resp.rs @@ -187,6 +187,8 @@ impl PrometheusJsonResponse { let mut tag_column_indices = Vec::new(); let mut first_field_column_index = None; + let mut num_label_columns = 0; + for (i, column) in batches.schema().column_schemas().iter().enumerate() { match column.data_type { ConcreteDataType::Timestamp(datatypes::types::TimestampType::Millisecond(_)) => { @@ -211,6 +213,7 @@ impl PrometheusJsonResponse { } ConcreteDataType::String(_) => { tag_column_indices.push(i); + num_label_columns += 1; } _ => {} } @@ -223,9 +226,10 @@ impl PrometheusJsonResponse { reason: "no value column found".to_string(), })?; - let metric_name = (METRIC_NAME.to_string(), metric_name); - let mut buffer = BTreeMap::, Vec<(f64, String)>>::new(); + let metric_name = (METRIC_NAME, metric_name.as_str()); + let mut buffer = BTreeMap::, Vec<(f64, String)>>::new(); + let shcema = batches.schema(); for batch in batches.iter() { // prepare things... let tag_columns = tag_column_indices @@ -240,7 +244,7 @@ impl PrometheusJsonResponse { .collect::>(); let tag_names = tag_column_indices .iter() - .map(|c| batches.schema().column_name_by_index(*c).to_string()) + .map(|c| shcema.column_name_by_index(*c)) .collect::>(); let timestamp_column = batch .column(timestamp_column_index) @@ -260,11 +264,12 @@ impl PrometheusJsonResponse { for row_index in 0..batch.num_rows() { // retrieve tags // TODO(ruihang): push table name `__metric__` - let mut tags = vec![metric_name.clone()]; + 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.to_string(), tag_value.to_string())); + tags.push((tag_name, tag_value)); } } @@ -292,7 +297,10 @@ impl PrometheusJsonResponse { // accumulate data into result buffer.into_iter().for_each(|(tags, mut values)| { - let metric = tags.into_iter().collect(); + let metric = tags + .into_iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect::>(); match result { PromQueryResult::Vector(ref mut v) => { v.push(PromSeriesVector { From ad866e2d9f22ce121a789d2a2b05e8b47d9bb5b1 Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Sat, 25 Jan 2025 21:55:32 +0800 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Ruihang Xia --- src/servers/src/http/result/prometheus_resp.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/servers/src/http/result/prometheus_resp.rs b/src/servers/src/http/result/prometheus_resp.rs index 1a4c333d29cc..8aa28011a274 100644 --- a/src/servers/src/http/result/prometheus_resp.rs +++ b/src/servers/src/http/result/prometheus_resp.rs @@ -229,7 +229,7 @@ impl PrometheusJsonResponse { let metric_name = (METRIC_NAME, metric_name.as_str()); let mut buffer = BTreeMap::, Vec<(f64, String)>>::new(); - let shcema = batches.schema(); + let schema = batches.schema(); for batch in batches.iter() { // prepare things... let tag_columns = tag_column_indices @@ -244,7 +244,7 @@ impl PrometheusJsonResponse { .collect::>(); let tag_names = tag_column_indices .iter() - .map(|c| shcema.column_name_by_index(*c)) + .map(|c| schema.column_name_by_index(*c)) .collect::>(); let timestamp_column = batch .column(timestamp_column_index)