diff --git a/src/middleware.rs b/src/middleware.rs index 37a8fb5c2..f80a8674c 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -1,6 +1,7 @@ use crate::{DefaultRootSpanBuilder, RequestId, RootSpan, RootSpanBuilder}; use actix_web::body::{BodySize, MessageBody}; use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform}; +use actix_web::http::StatusCode; use actix_web::web::Bytes; use actix_web::{Error, HttpMessage, ResponseError}; use std::future::{ready, Future, Ready}; @@ -238,18 +239,18 @@ fn emit_event_on_error(outcome: &Result, actix_we match outcome { Ok(response) => { if let Some(err) = response.response().error() { - emit_error_event(err.as_response_error()) + // use the status code already constructed for the outgoing HTTP response + emit_error_event(err.as_response_error(), response.status()) } } Err(error) => { let response_error = error.as_response_error(); - emit_error_event(response_error) + emit_error_event(response_error, response_error.status_code()) } } } -fn emit_error_event(response_error: &dyn ResponseError) { - let status_code = response_error.status_code(); +fn emit_error_event(response_error: &dyn ResponseError, status_code: StatusCode) { let error_msg_prefix = "Error encountered while processing the incoming HTTP request"; if status_code.is_client_error() { tracing::warn!("{}: {:?}", error_msg_prefix, response_error); diff --git a/src/root_span_builder.rs b/src/root_span_builder.rs index f3788b376..74aeacd99 100644 --- a/src/root_span_builder.rs +++ b/src/root_span_builder.rs @@ -1,6 +1,7 @@ use crate::root_span; use actix_web::dev::{ServiceRequest, ServiceResponse}; -use actix_web::Error; +use actix_web::http::StatusCode; +use actix_web::{Error, ResponseError}; use tracing::Span; /// `RootSpanBuilder` allows you to customise the root span attached by @@ -43,29 +44,30 @@ impl RootSpanBuilder for DefaultRootSpanBuilder { match &outcome { Ok(response) => { if let Some(error) = response.response().error() { - handle_error(span, error) + // use the status code already constructed for the outgoing HTTP response + handle_error(span, response.status(), error.as_response_error()); } else { let code: i32 = response.response().status().as_u16().into(); span.record("http.status_code", &code); span.record("otel.status_code", &"OK"); } } - Err(error) => handle_error(span, error), + Err(error) => { + let response_error = error.as_response_error(); + handle_error(span, response_error.status_code(), response_error); + } }; } } -fn handle_error(span: Span, error: &actix_web::Error) { - let response_error = error.as_response_error(); - +fn handle_error(span: Span, status_code: StatusCode, response_error: &dyn ResponseError) { // 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(); let code: i32 = status_code.as_u16().into(); + span.record("http.status_code", &code); if status_code.is_client_error() {