prometheus_http_client/
traits.rs

1//! Trait for Prometheus API requests
2
3use crate::{Error, PromResponse};
4use reqwest::{Client, Url};
5use serde::{Serialize, de::DeserializeOwned};
6use std::fmt::Debug;
7
8/// Trait for types that can be sent as Prometheus API requests
9#[async_trait::async_trait]
10pub trait PromRequest: Serialize {
11    /// The API path for this request type (e.g., "/api/v1/query")
12    const PATH: &str;
13    /// The output type returned by this request
14    type Output<KV: Clone + Debug + DeserializeOwned>: Clone + Debug + DeserializeOwned;
15
16    /// Send the request to the given prometheus host URL
17    async fn send<KV>(&self, host: &str) -> Result<Self::Output<KV>, Error>
18    where
19        KV: Clone + Debug + DeserializeOwned,
20    {
21        self.send_with_client(&Client::new(), host).await
22    }
23
24    /// Send the request using the provided reqwest client
25    async fn send_with_client<KV>(
26        &self,
27        client: &Client,
28        host: &str,
29    ) -> Result<Self::Output<KV>, Error>
30    where
31        KV: Clone + Debug + DeserializeOwned,
32    {
33        let url = Url::parse(host)?.join(Self::PATH)?;
34
35        let resp: PromResponse<Self::Output<KV>> =
36            client.get(url).query(&self).send().await?.json().await?;
37
38        let data = resp.into_result()?;
39        Ok(data)
40    }
41}