use actix_web::dev::{Service, Transform}; use futures::future::{ok, Ready}; use std::task::{Context, Poll}; use tracing_futures::{Instrument, Instrumented}; use uuid::Uuid; pub(crate) struct Tracing; pub(crate) struct TracingMiddleware { inner: S, } impl Transform for Tracing where S: Service, S::Future: 'static, { type Request = S::Request; type Response = S::Response; type Error = S::Error; type InitError = (); type Transform = TracingMiddleware; type Future = Ready>; fn new_transform(&self, service: S) -> Self::Future { ok(TracingMiddleware { inner: service }) } } impl Service for TracingMiddleware where S: Service, S::Future: 'static, { type Request = S::Request; type Response = S::Response; type Error = S::Error; type Future = Instrumented; fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { self.inner.poll_ready(cx) } fn call(&mut self, req: S::Request) -> Self::Future { let uuid = Uuid::new_v4(); self.inner .call(req) .instrument(tracing::info_span!("request", ?uuid)) } }