#![deny(missing_docs)]
pub use reqwest::Client as ReqwestClient;
use chrono::{DateTime, Utc};
use serde::{Serialize, de::DeserializeOwned};
use std::fmt::Debug;
mod builders;
pub use builders::QueryRangeRequestBuilder;
mod error;
pub use error::Error;
mod labels;
pub use labels::{ExtractLabels, Labels};
mod messages;
use messages::PromResponse;
pub use messages::{
AlertInfo, AlertStatus, AlertsResponse, MetricTimeseries, MetricVal, MetricValue, PromData,
};
#[cfg(feature = "plot")]
pub mod plot;
mod traits;
pub use traits::PromRequest;
#[derive(Clone, Debug, Serialize)]
pub struct QueryRequest {
pub query: String,
pub time: Option<DateTime<Utc>>,
}
impl PromRequest for QueryRequest {
const PATH: &str = "/api/v1/query";
type Output<KV: Clone + Debug + DeserializeOwned> = PromData<KV>;
}
#[derive(Clone, Debug, Serialize)]
pub struct QueryRangeRequest {
query: String,
start: DateTime<Utc>,
end: DateTime<Utc>,
step: f64,
}
impl QueryRangeRequest {
pub fn builder(query: impl Into<String>) -> QueryRangeRequestBuilder {
QueryRangeRequestBuilder::new(query.into())
}
}
impl PromRequest for QueryRangeRequest {
const PATH: &str = "/api/v1/query_range";
type Output<KV: Clone + Debug + DeserializeOwned> = PromData<KV>;
}
#[derive(Clone, Debug, Serialize)]
#[serde(transparent)]
pub struct SeriesRequest {
pub matches: MatchList,
}
impl PromRequest for SeriesRequest {
const PATH: &str = "/api/v1/series";
type Output<KV: Clone + Debug + DeserializeOwned> = Vec<KV>;
}
#[derive(Clone, Debug, Serialize)]
#[serde(transparent)]
pub struct LabelsRequest {
pub matches: MatchList,
}
impl PromRequest for LabelsRequest {
const PATH: &str = "/api/v1/labels";
type Output<KV: Clone + Debug + DeserializeOwned> = Vec<String>;
}
#[derive(Clone, Debug, Serialize)]
pub struct AlertsRequest {}
impl PromRequest for AlertsRequest {
const PATH: &str = "/api/v1/alerts";
type Output<KV: Clone + Debug + DeserializeOwned> = AlertsResponse<KV>;
}
#[derive(Clone, Debug)]
pub struct MatchList(Vec<String>);
impl Serialize for MatchList {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeMap;
let mut map = serializer.serialize_map(Some(self.0.len()))?;
for v in &self.0 {
map.serialize_entry("match[]", v)?;
}
map.end()
}
}
impl From<Vec<String>> for MatchList {
fn from(src: Vec<String>) -> Self {
Self(src)
}
}
impl FromIterator<String> for MatchList {
fn from_iter<T>(iter: T) -> Self
where
T: IntoIterator<Item = String>,
{
Self(iter.into_iter().collect())
}
}