1
0
mirror of https://github.com/actix/actix-extras.git synced 2025-02-23 10:53:02 +01:00

Properly extract errors coming from handlers.

This commit is contained in:
Luca Palmieri 2021-04-28 22:19:32 +01:00
parent c2264e7d0d
commit 737a718467
2 changed files with 50 additions and 27 deletions

View File

@ -1,6 +1,6 @@
use crate::{DefaultRootSpanBuilder, RequestId, RootSpan, RootSpanBuilder}; use crate::{DefaultRootSpanBuilder, RequestId, RootSpan, RootSpanBuilder};
use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform}; use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform};
use actix_web::{Error, HttpMessage}; use actix_web::{Error, HttpMessage, ResponseError};
use futures::future::{ok, Ready}; use futures::future::{ok, Ready};
use futures::task::{Context, Poll}; use futures::task::{Context, Poll};
use std::future::Future; use std::future::Future;
@ -143,20 +143,37 @@ where
RootSpanType::on_request_end(Span::current(), &outcome); RootSpanType::on_request_end(Span::current(), &outcome);
#[cfg(feature = "emit_event_on_error")] #[cfg(feature = "emit_event_on_error")]
if let Err(error) = &outcome { {
let response_error = error.as_response_error(); emit_event_on_error(&outcome);
let status_code = response_error.status_code();
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);
} else {
tracing::error!("{}: {:?}", error_msg_prefix, response_error);
}
} }
outcome outcome
} }
.instrument(root_span), .instrument(root_span),
) )
} }
} }
fn emit_event_on_error<B: 'static>(outcome: &Result<ServiceResponse<B>, actix_web::Error>) {
match outcome {
Ok(response) => {
if let Some(err) = response.response().error() {
emit_error_event(err.as_response_error())
}
}
Err(error) => {
let response_error = error.as_response_error();
emit_error_event(response_error)
}
}
}
fn emit_error_event(response_error: &dyn ResponseError) {
let status_code = response_error.status_code();
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);
} else {
tracing::error!("{}: {:?}", error_msg_prefix, response_error);
}
}

View File

@ -42,10 +42,19 @@ impl RootSpanBuilder for DefaultRootSpanBuilder {
fn on_request_end<B>(span: Span, outcome: &Result<ServiceResponse<B>, Error>) { fn on_request_end<B>(span: Span, outcome: &Result<ServiceResponse<B>, Error>) {
match &outcome { match &outcome {
Ok(response) => { Ok(response) => {
if let Some(error) = response.response().error() {
handle_error(span, error)
} else {
span.record("http.status_code", &response.response().status().as_u16()); span.record("http.status_code", &response.response().status().as_u16());
span.record("otel.status_code", &"OK"); span.record("otel.status_code", &"OK");
} }
Err(error) => { }
Err(error) => handle_error(span, error),
};
}
}
fn handle_error(span: Span, error: &actix_web::Error) {
let response_error = error.as_response_error(); let response_error = error.as_response_error();
span.record( span.record(
"exception.message", "exception.message",
@ -60,7 +69,4 @@ impl RootSpanBuilder for DefaultRootSpanBuilder {
} else { } else {
span.record("otel.status_code", &"ERROR"); span.record("otel.status_code", &"ERROR");
} }
}
};
}
} }