From a620cd2b1b510437b794f6ae385cb40f70c261a3 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Tue, 12 Mar 2024 21:08:59 -0400 Subject: [PATCH] dev: do query filter modifications --- src/query/prom.rs | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/query/prom.rs b/src/query/prom.rs index d05d1b2..8393060 100644 --- a/src/query/prom.rs +++ b/src/query/prom.rs @@ -48,7 +48,6 @@ impl<'conn> PromQueryConn<'conn> { meta, span: None, filters: None, - } } @@ -71,6 +70,33 @@ impl<'conn> PromQueryConn<'conn> { self } + fn get_query(&self) -> String { + let first = true; + let mut filter_string = String::new(); + if let Some(filters) = self.filters { + for (k, v) in filters.iter() { + if !first { + filter_string.push_str(","); + } + filter_string.push_str(*k); + filter_string.push_str("=~"); + filter_string.push('"'); + filter_string.push_str(*v); + filter_string.push('"'); + } + filter_string.push(','); + } + if self.query.contains("FILTERS") { + // TODO(jwall): replace the FILTERS placeholder with our filters + self.query.replace("FILTERS", &filter_string) + } else { + let mut filter_string_curly = String::from("{"); + filter_string_curly.push_str(&filter_string); + // TODO(jwall): Place them after the first `{` + self.query.replace("{", &filter_string_curly) + } + } + pub async fn get_results(&self) -> anyhow::Result { debug!("Getting results for query"); let client = Client::try_from(self.source)?; @@ -100,16 +126,18 @@ impl<'conn> PromQueryConn<'conn> { (start.timestamp(), end.timestamp(), 30 as f64) }; //debug!(start, end, step_resolution, "Running Query with range values"); + let query = self.get_query(); + debug!(?query, "Using promql query"); match self.query_type { QueryType::Range => { let results = client - .query_range(self.query, start, end, step_resolution) + .query_range(&query, start, end, step_resolution) .get() .await?; //debug!(?results, "range results"); Ok(results) } - QueryType::Scalar => Ok(client.query(self.query).get().await?), + QueryType::Scalar => Ok(client.query(&query).get().await?), } } }