diff --git a/tower-http/src/trace/make_span.rs b/tower-http/src/trace/make_span.rs index c13c3c4d..904d941f 100644 --- a/tower-http/src/trace/make_span.rs +++ b/tower-http/src/trace/make_span.rs @@ -1,5 +1,7 @@ use http::Request; -use tracing::Span; +use tracing::{Level, Span}; + +use super::DEFAULT_MESSAGE_LEVEL; /// Trait used to generate [`Span`]s from requests. [`Trace`] wraps all request handling in this /// span. @@ -32,6 +34,7 @@ where /// [`Trace`]: super::Trace #[derive(Debug, Clone)] pub struct DefaultMakeSpan { + level: Level, include_headers: bool, } @@ -39,10 +42,21 @@ impl DefaultMakeSpan { /// Create a new `DefaultMakeSpan`. pub fn new() -> Self { Self { + level: DEFAULT_MESSAGE_LEVEL, include_headers: false, } } + /// Set the [`Level`] used for the [tracing span]. + /// + /// Defaults to [`Level::DEBUG`]. + /// + /// [tracing span]: https://docs.rs/tracing/latest/tracing/#spans + pub fn level(mut self, level: Level) -> Self { + self.level = level; + self + } + /// Include request headers on the [`Span`]. /// /// By default headers are not included. @@ -62,21 +76,48 @@ impl Default for DefaultMakeSpan { impl MakeSpan for DefaultMakeSpan { fn make_span(&mut self, request: &Request) -> Span { - if self.include_headers { - tracing::debug_span!( - "request", - method = %request.method(), - uri = %request.uri(), - version = ?request.version(), - headers = ?request.headers(), - ) - } else { - tracing::debug_span!( - "request", - method = %request.method(), - uri = %request.uri(), - version = ?request.version(), - ) + // This ugly macro is needed, unfortunately, because `tracing::span!` + // required the level argument to be static. Meaning we can't just pass + // `self.level`. + macro_rules! make_span { + ($level:expr) => { + if self.include_headers { + tracing::span!( + $level, + "request", + method = %request.method(), + uri = %request.uri(), + version = ?request.version(), + headers = ?request.headers(), + ) + } else { + tracing::span!( + $level, + "request", + method = %request.method(), + uri = %request.uri(), + version = ?request.version(), + ) + } + } + } + + match self.level { + Level::ERROR => { + make_span!(Level::ERROR) + } + Level::WARN => { + make_span!(Level::WARN) + } + Level::INFO => { + make_span!(Level::INFO) + } + Level::DEBUG => { + make_span!(Level::DEBUG) + } + Level::TRACE => { + make_span!(Level::TRACE) + } } } }