diff --git a/Cargo.toml b/Cargo.toml index 17913d48f..d918cc660 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,6 @@ emit_event_on_error = [] actix-web = { version = "=4.0.0-beta.9", default-features = false } tracing = "0.1.19" tracing-futures = "0.2.4" -futures = "0.3.5" uuid = { version = "0.8.1", features = ["v4"] } opentelemetry_0_13_pkg = { package = "opentelemetry", version = "0.13", optional = true } opentelemetry_0_14_pkg = { package = "opentelemetry", version = "0.14", optional = true } diff --git a/src/middleware.rs b/src/middleware.rs index ad8953e22..7477320af 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -1,8 +1,7 @@ use crate::{DefaultRootSpanBuilder, RequestId, RootSpan, RootSpanBuilder}; use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform}; use actix_web::{Error, HttpMessage, ResponseError}; -use futures::future::{ok, Ready}; -use std::future::Future; +use std::future::{ready, Future, Ready}; use std::pin::Pin; use tracing::Span; use tracing_futures::Instrument; @@ -100,10 +99,10 @@ where type Future = Ready>; fn new_transform(&self, service: S) -> Self::Future { - ok(TracingLoggerMiddleware { + ready(Ok(TracingLoggerMiddleware { service, root_span_builder: std::marker::PhantomData::default(), - }) + })) } } @@ -134,7 +133,7 @@ where let root_span_wrapper = RootSpan::new(root_span.clone()); req.extensions_mut().insert(root_span_wrapper); - let fut = self.service.call(req); + let fut = root_span.in_scope(|| self.service.call(req)); Box::pin( async move { let outcome = fut.await; diff --git a/src/root_span_builder.rs b/src/root_span_builder.rs index b14919187..58699304b 100644 --- a/src/root_span_builder.rs +++ b/src/root_span_builder.rs @@ -56,11 +56,13 @@ impl RootSpanBuilder for DefaultRootSpanBuilder { fn handle_error(span: Span, error: &actix_web::Error) { let response_error = error.as_response_error(); - span.record( - "exception.message", - &tracing::field::display(response_error), - ); - span.record("exception.details", &tracing::field::debug(response_error)); + + // pre-formatting errors is a workaround for https://github.com/tokio-rs/tracing/issues/1565 + let display = format!("{}", response_error); + let debug = format!("{:?}", response_error); + span.record("exception.message", &tracing::field::display(display)); + span.record("exception.details", &tracing::field::display(debug)); + let status_code = response_error.status_code(); span.record("http.status_code", &status_code.as_u16());