Skip to content
Snippets Groups Projects
Commit 1f9b5519 authored by Maaz Ahmed's avatar Maaz Ahmed
Browse files

Merge branch '14-feat-raw-json-string-or-serde_json-value-instead-of-structs' into 'main'

Resolve "feat: raw json (string or serde_json::Value) instead of structs"

Closes #14

See merge request !17
parents 83a0d5d2 e5596a15
No related branches found
No related tags found
1 merge request!17Resolve "feat: raw json (string or serde_json::Value) instead of structs"
Pipeline #14593 passed with stages
in 3 minutes and 1 second
...@@ -617,9 +617,9 @@ dependencies = [ ...@@ -617,9 +617,9 @@ dependencies = [
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.6.4" version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]] [[package]]
name = "mime" name = "mime"
...@@ -842,9 +842,9 @@ dependencies = [ ...@@ -842,9 +842,9 @@ dependencies = [
[[package]] [[package]]
name = "prometheus-http-query" name = "prometheus-http-query"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7849dd7319357e220886589ea0a0760ff138cde2eedfbbfd2708caee0b15dfc" checksum = "5064f9bd466079eb96e7e8a920506c26053a040ee0a388c8f8e9280a50f5599a"
dependencies = [ dependencies = [
"enum-as-inner", "enum-as-inner",
"mime", "mime",
......
...@@ -7,7 +7,7 @@ edition = "2021" ...@@ -7,7 +7,7 @@ edition = "2021"
[dependencies] [dependencies]
enum-as-inner = "0.6.0" enum-as-inner = "0.6.0"
prometheus-http-query = "0.8.0" prometheus-http-query = "0.8.1"
reqwest = "0.11.22" reqwest = "0.11.22"
url = "2.5.0" url = "2.5.0"
serde = { version = "1.0.193", optional = true } serde = { version = "1.0.193", optional = true }
......
...@@ -12,7 +12,7 @@ use std::fmt::Display; ...@@ -12,7 +12,7 @@ use std::fmt::Display;
use prometheus_http_query::Client; use prometheus_http_query::Client;
use query::{ops::Operable, IntoQuery}; use query::{ops::Operable, IntoQuery};
use reqwest::header::HeaderValue; use reqwest::header::HeaderValue;
use result::{IntoQryResult, QryResult}; use result::{IntoResult, QryResult, RawResult};
use seal::Sealed; use seal::Sealed;
use url::Url; use url::Url;
...@@ -86,8 +86,28 @@ impl QueryManager { ...@@ -86,8 +86,28 @@ impl QueryManager {
builder = builder.timeout(*timeout); builder = builder.timeout(*timeout);
} }
match self.method { match self.method {
Method::Get => builder.get().await.into_qry_result(), Method::Get => builder.get().await.into_result(),
Method::Post => builder.post().await.into_qry_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 { ...@@ -146,8 +166,8 @@ impl QueryManager {
builder = builder.timeout(*timeout); builder = builder.timeout(*timeout);
} }
match self.method { match self.method {
Method::Get => builder.get().await.into_qry_result(), Method::Get => builder.get().await.into_result(),
Method::Post => builder.post().await.into_qry_result(), Method::Post => builder.post().await.into_result(),
} }
} }
} }
......
...@@ -11,14 +11,24 @@ use prometheus_http_query::{error, response}; ...@@ -11,14 +11,24 @@ use prometheus_http_query::{error, response};
use std::fmt::{self, Display}; use std::fmt::{self, Display};
pub type QryResult = std::result::Result<Data, Error>; 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 /// Internal trait used for converting the `prometheus-http-query` crate's query result into the internal result type
pub(crate) trait IntoQryResult { pub(crate) trait IntoResult {
fn into_qry_result(self) -> QryResult; type Result;
fn into_result(self) -> Self::Result;
} }
impl IntoQryResult for Result<response::PromqlResult, error::Error> { impl IntoResult for Result<response::PromqlResult, error::Error> {
fn into_qry_result(self) -> QryResult { 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()) self.map(|r| r.into()).map_err(|e| e.into())
} }
} }
......
...@@ -41,6 +41,14 @@ async fn multi_queries() { ...@@ -41,6 +41,14 @@ async fn multi_queries() {
assert!(res.len() == 2); 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) { fn get_url_token() -> (String, String) {
dotenv::dotenv().expect("No .env file found in working dir"); dotenv::dotenv().expect("No .env file found in working dir");
( (
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment