diff --git a/Cargo.lock b/Cargo.lock index 7cefca43c9c74dcf737c7edd8e8ddab194eb6de1..c7466bbccd8d68a159e491ca620c7c9cc3d9e842 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -617,9 +617,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -842,9 +842,9 @@ dependencies = [ [[package]] name = "prometheus-http-query" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7849dd7319357e220886589ea0a0760ff138cde2eedfbbfd2708caee0b15dfc" +checksum = "5064f9bd466079eb96e7e8a920506c26053a040ee0a388c8f8e9280a50f5599a" dependencies = [ "enum-as-inner", "mime", diff --git a/Cargo.toml b/Cargo.toml index 6a75abc4c3a3184eb79ac61b40f896a4d65e62e7..a9e44221fd1a12008d166d611c74ce411ad38e8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] enum-as-inner = "0.6.0" -prometheus-http-query = "0.8.0" +prometheus-http-query = "0.8.1" reqwest = "0.11.22" url = "2.5.0" serde = { version = "1.0.193", optional = true } diff --git a/src/lib.rs b/src/lib.rs index 131832986d10d52c667a3bc012f17acb3d7f9b71..0be306eaddc6fb5c4652e2c486b84b3b5d8deeb0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,7 +12,7 @@ use std::fmt::Display; use prometheus_http_query::Client; use query::{ops::Operable, IntoQuery}; use reqwest::header::HeaderValue; -use result::{IntoQryResult, QryResult}; +use result::{IntoResult, QryResult, RawResult}; use seal::Sealed; use url::Url; @@ -86,8 +86,28 @@ impl QueryManager { builder = builder.timeout(*timeout); } match self.method { - Method::Get => builder.get().await.into_qry_result(), - Method::Post => builder.post().await.into_qry_result(), + Method::Get => builder.get().await.into_result(), + Method::Post => builder.post().await.into_result(), + } + } + + /// Send a query to the Prometheus server and retreive raw response ([`reqwest::Response`]) + /// + /// This method accepts any type that implements the `IntoQuery` trait. + /// The trait is implemented for `&str`, `String`, `&String`, and __mquery's__ + /// internal types such as [`query::Metric`], [`query::Scalar`] and others that result + /// from the query builder API. + pub async fn query_raw<Q: IntoQuery>(&self, query: Q) -> RawResult { + let mut builder = self.client.query(query.into_query().as_ref()); + if let Some((name, val)) = self.auth.get_header() { + builder = builder.header(name, val); + } + if let Some(timeout) = self.timeout.as_ref() { + builder = builder.timeout(*timeout); + } + match self.method { + Method::Get => builder.get_raw().await.into_result(), + Method::Post => builder.post_raw().await.into_result(), } } @@ -146,8 +166,8 @@ impl QueryManager { builder = builder.timeout(*timeout); } match self.method { - Method::Get => builder.get().await.into_qry_result(), - Method::Post => builder.post().await.into_qry_result(), + Method::Get => builder.get().await.into_result(), + Method::Post => builder.post().await.into_result(), } } } diff --git a/src/result.rs b/src/result.rs index 56b25ea21c9f0c3e27267662f479d57723760e26..684933342a7d35c4dc7e53d1a9fe1e5ce5a7c69f 100644 --- a/src/result.rs +++ b/src/result.rs @@ -11,14 +11,24 @@ use prometheus_http_query::{error, response}; use std::fmt::{self, Display}; pub type QryResult = std::result::Result<Data, Error>; +pub type RawResult = std::result::Result<reqwest::Response, Error>; /// Internal trait used for converting the `prometheus-http-query` crate's query result into the internal result type -pub(crate) trait IntoQryResult { - fn into_qry_result(self) -> QryResult; +pub(crate) trait IntoResult { + type Result; + fn into_result(self) -> Self::Result; } -impl IntoQryResult for Result<response::PromqlResult, error::Error> { - fn into_qry_result(self) -> QryResult { +impl IntoResult for Result<response::PromqlResult, error::Error> { + type Result = QryResult; + fn into_result(self) -> Self::Result { + self.map(|r| r.into()).map_err(|e| e.into()) + } +} + +impl IntoResult for Result<reqwest::Response, error::Error> { + type Result = RawResult; + fn into_result(self) -> Self::Result { self.map(|r| r.into()).map_err(|e| e.into()) } } diff --git a/tests/api.rs b/tests/api.rs index da2fe672114b890ae10ce6ca84c607be4f4473bc..a11d85360b4433952fc62e643779796773a7e066 100644 --- a/tests/api.rs +++ b/tests/api.rs @@ -41,6 +41,14 @@ async fn multi_queries() { assert!(res.len() == 2); } +#[tokio::test] +async fn raw_response() { + QueryManager::new(utils::URL.parse().unwrap()) + .query_raw("metric") + .await + .unwrap(); +} + fn get_url_token() -> (String, String) { dotenv::dotenv().expect("No .env file found in working dir"); (