use std::borrow::Cow;
use http::Extensions;
use reqwest::{Request, Response};
use tracing::Span;
use reqwest_tracing::{
ReqwestOtelSpanBackend, TracingMiddleware, default_on_request_end, reqwest_otel_span,
};
pub type HttpTraceMiddleware = TracingMiddleware<HttpTrace>;
pub struct HttpTrace;
impl ReqwestOtelSpanBackend for HttpTrace {
fn on_request_start(req: &Request, _extension: &mut Extensions) -> Span {
let name = format!("REQUEST {} {}", req.method(), req.url());
let body: Cow<'_, str> = req
.body()
.and_then(|x| x.as_bytes())
.map(|x| String::from_utf8_lossy(x))
.unwrap_or_default();
let body: &str = &body;
reqwest_otel_span!(name = name, req, body)
}
fn on_request_end(
span: &Span,
outcome: &reqwest_middleware::Result<Response>,
_extension: &mut Extensions,
) {
default_on_request_end(span, outcome);
}
}