From 476ac51b87e98139cc0aafd7247373d2be7d6f8a Mon Sep 17 00:00:00 2001 From: "Aode (lion)" Date: Sat, 27 Nov 2021 13:36:51 -0600 Subject: [PATCH] Emit our own errors --- Cargo.toml | 2 +- src/root_span_builder.rs | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9a0879899..040a25cf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,7 +50,7 @@ serde = { version = "1.0.130", features = ["derive"] } actix = "0.12.0" actix-web = { version = "4.0.0-beta.9", default-features = false, features = ["rustls"] } tracing = "0.1.29" -tracing-actix-web = "0.5.0-beta.3" +tracing-actix-web = { version = "0.5.0-beta.3", default-features = false } tracing-error = "0.2.0" tracing-log = "0.1.2" tracing-subscriber = { version = "0.3.2", features = ["env-filter"] } diff --git a/src/root_span_builder.rs b/src/root_span_builder.rs index b2db016c2..63168c027 100644 --- a/src/root_span_builder.rs +++ b/src/root_span_builder.rs @@ -1,4 +1,4 @@ -use actix_web::{http::StatusCode, ResponseError}; +use actix_web::{dev::ServiceResponse, http::StatusCode, ResponseError}; use tracing::Span; use tracing_actix_web::RootSpanBuilder; @@ -34,6 +34,8 @@ impl RootSpanBuilder for QuieterRootSpanBuilder { span: tracing::Span, outcome: &Result, actix_web::Error>, ) { + emit_event_on_error::(outcome); + match &outcome { Ok(response) => { if let Some(error) = response.response().error() { @@ -69,3 +71,32 @@ fn handle_error(span: Span, status_code: StatusCode, response_error: &dyn Respon span.record("otel.status_code", &"ERROR"); } } + +fn emit_event_on_error(outcome: &Result, actix_web::Error>) { + match outcome { + Ok(response) => { + if let Some(err) = response.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, response_error.status_code()) + } + } +} + +fn emit_error_event(response_error: &dyn ResponseError, status_code: StatusCode) { + let span = tracing::info_span!( + parent: None, + "Error encountered while processing the incoming HTTP request" + ); + let entered = span.enter(); + if status_code.is_client_error() { + tracing::warn!("{}\n{:?}", response_error, response_error); + } else { + tracing::error!("{}\n{:?}", response_error, response_error); + } + drop(entered); +}