use bytes::Bytes;
use http::Request;
use super::{HttpClient, HttpResponse, Idempotency};
use crate::{error::Error, platform::MaybeSendBoxFuture};
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> {
fn execute(
&self,
request: Request<Bytes>,
idempotency: Idempotency,
) -> MaybeSendBoxFuture<'_, Result<HttpResponse, Error>> {
Box::pin(async move {
let method = request.method().to_string();
let host = request.uri().host().unwrap_or("").to_owned();
let result = self.inner.execute(request, idempotency).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()
}
}