use bytes::Bytes;
use http::Request;
use super::{HttpClient, HttpResponse};
pub struct MetricsHttpClient<C> {
inner: C,
}
#[bon::bon]
impl<C> MetricsHttpClient<C> {
#[builder]
pub fn new(inner: C) -> Self {
Self { inner }
}
}
impl<C> MetricsHttpClient<C> {
pub fn inner(&self) -> &C {
&self.inner
}
pub fn into_inner(self) -> C {
self.inner
}
}
impl<C: HttpClient> HttpClient for MetricsHttpClient<C> {
type Response = C::Response;
type Error = C::Error;
type ResponseError = C::ResponseError;
async fn execute(&self, request: Request<Bytes>) -> Result<Self::Response, Self::Error> {
let method = request.method().to_string();
let host = request.uri().host().unwrap_or("").to_owned();
let result = self.inner.execute(request).await;
let outcome = match &result {
Ok(resp) if resp.status().is_success() => "success",
_ => "error",
};
::metrics::counter!(
"huskarl.http.request",
"host" => host,
"method" => method,
"outcome" => outcome,
)
.increment(1);
result
}
fn uses_mtls(&self) -> bool {
self.inner.uses_mtls()
}
}