use http::Extensions;
use opentelemetry_http::HeaderInjector;
use reqwest::{Request, Response};
use reqwest_middleware::{Middleware, Next, Result};
use tracing::Span;
use tracing_opentelemetry::OpenTelemetrySpanExt as _;
#[derive(Debug, Default)]
pub struct OtelMiddleware;
#[async_trait::async_trait]
impl Middleware for OtelMiddleware {
async fn handle(
&self,
mut req: Request,
extensions: &mut Extensions,
next: Next<'_>,
) -> Result<Response> {
opentelemetry::global::get_text_map_propagator(|propagator| {
let cx = Span::current().context();
propagator.inject_context(&cx, &mut HeaderInjector(req.headers_mut()));
});
next.run(req, extensions).await
}
}