diff --git a/Cargo.lock b/Cargo.lock index 7e9d90e21..240fc9ed7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1982,6 +1982,7 @@ dependencies = [ "resolver_api", "serde", "serde_json", + "serror", "sha2", "simple_logger", "slack_client_rs", @@ -2025,6 +2026,7 @@ dependencies = [ "run_command", "serde", "serde_json", + "serror", "simple_logger", "svi", "sysinfo", @@ -2730,6 +2732,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e988182713aeed6a619a88bca186f6d6407483485ffe44c869ee264f8eabd13f" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.9" @@ -2840,6 +2851,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "serror" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ace3cd0543abaa9a05a1c4b5219c832aebf2a011ae31da4cf2b0d9808d6aea" +dependencies = [ + "anyhow", + "serde", + "serde-error", + "serde_json", +] + [[package]] name = "sha-1" version = "0.10.1" diff --git a/Cargo.toml b/Cargo.toml index 7683ae419..4c875792e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ make_option = "0.1.7" resolver_api = "0.1.6" parse_csl = "0.1.0" mungos = "0.4.19" +serror = "0.1.1" svi = "0.1.4" # external tokio = { version = "1.32.0", features = ["full"] } diff --git a/bin/core/Cargo.toml b/bin/core/Cargo.toml index a5b3d02bb..75c56e4cc 100644 --- a/bin/core/Cargo.toml +++ b/bin/core/Cargo.toml @@ -24,6 +24,7 @@ termination_signal.workspace = true resolver_api.workspace = true mungos.workspace = true slack.workspace = true +serror.workspace = true # external tokio.workspace = true tokio-util.workspace = true diff --git a/bin/core/src/auth/mod.rs b/bin/core/src/auth/mod.rs index 5a0360c01..fab88abfb 100644 --- a/bin/core/src/auth/mod.rs +++ b/bin/core/src/auth/mod.rs @@ -7,6 +7,7 @@ use axum::{ use rand::{distributions::Alphanumeric, thread_rng, Rng}; use reqwest::StatusCode; use resolver_api::Resolver; +use serror::serialize_error; use uuid::Uuid; mod github; @@ -48,14 +49,12 @@ pub fn router(state: &State) -> Router { let timer = Instant::now(); let req_id = Uuid::new_v4(); info!("/auth request {req_id} | METHOD: {}", request.req_type()); - let res = state - .resolve_request(request, ()) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:?}"))); + let res = state.resolve_request(request, ()).await; if let Err(e) = &res { info!("/auth request {req_id} | ERROR: {e:?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; let elapsed = timer.elapsed(); info!("/auth request {req_id} | resolve time: {elapsed:?}"); debug!("/auth request {req_id} | RESPONSE: {res}"); diff --git a/bin/core/src/requests/execute/mod.rs b/bin/core/src/requests/execute/mod.rs index 3a6d3e756..f38488392 100644 --- a/bin/core/src/requests/execute/mod.rs +++ b/bin/core/src/requests/execute/mod.rs @@ -1,5 +1,6 @@ use std::time::Instant; +use anyhow::Context; use axum::{ headers::ContentType, http::StatusCode, middleware, routing::post, Extension, Json, Router, TypedHeader, @@ -7,6 +8,7 @@ use axum::{ use monitor_types::requests::execute::*; use resolver_api::{derive::Resolver, Resolve, Resolver}; use serde::{Deserialize, Serialize}; +use serror::serialize_error; use typeshare::typeshare; use uuid::Uuid; @@ -59,22 +61,20 @@ pub fn router() -> Router { "/execute request {req_id} | user: {} ({}) | {request:?}", user.username, user.id ); - let res = tokio::spawn(async move { - state - .resolve_request(request, user) + let res = + tokio::spawn(async move { state.resolve_request(request, user).await }) .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))) - }) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))); + .context("failure in spawned execute task"); if let Err(e) = &res { info!("/execute request {req_id} SPAWN ERROR: {e:#?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; if let Err(e) = &res { info!("/execute request {req_id} ERROR: {e:#?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; let elapsed = timer.elapsed(); info!("/execute request {req_id} | resolve time: {elapsed:?}"); Result::<_, (StatusCode, String)>::Ok((TypedHeader(ContentType::json()), res)) diff --git a/bin/core/src/requests/read/mod.rs b/bin/core/src/requests/read/mod.rs index 282a77047..1219fb00f 100644 --- a/bin/core/src/requests/read/mod.rs +++ b/bin/core/src/requests/read/mod.rs @@ -8,6 +8,7 @@ use axum::{ use monitor_types::requests::read::*; use resolver_api::{derive::Resolver, Resolve, ResolveToString, Resolver}; use serde::{Deserialize, Serialize}; +use serror::serialize_error; use typeshare::typeshare; use uuid::Uuid; @@ -136,12 +137,11 @@ pub fn router() -> Router { ); let res = state .resolve_request(request, user) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))); + .await; if let Err(e) = &res { warn!("/read request {req_id} ERROR: {e:#?}"); } - let res = res?; + let res = res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; let elapsed = timer.elapsed(); debug!("/read request {req_id} | resolve time: {elapsed:?}"); Result::<_, (StatusCode, String)>::Ok((TypedHeader(ContentType::json()), res)) diff --git a/bin/core/src/requests/write/mod.rs b/bin/core/src/requests/write/mod.rs index 83e9508d8..2d5082689 100644 --- a/bin/core/src/requests/write/mod.rs +++ b/bin/core/src/requests/write/mod.rs @@ -1,5 +1,6 @@ use std::time::Instant; +use anyhow::Context; use axum::{ headers::ContentType, http::StatusCode, middleware, routing::post, Extension, Json, Router, TypedHeader, @@ -7,6 +8,7 @@ use axum::{ use monitor_types::requests::write::*; use resolver_api::{derive::Resolver, Resolve, Resolver}; use serde::{Deserialize, Serialize}; +use serror::serialize_error; use typeshare::typeshare; use uuid::Uuid; @@ -109,22 +111,20 @@ pub fn router() -> Router { "/write request {req_id} | user: {} ({}) | {request:?}", user.username, user.id ); - let res = tokio::spawn(async move { - state - .resolve_request(request, user) + let res = + tokio::spawn(async move { state.resolve_request(request, user).await }) .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))) - }) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))); + .context("failure in spawned write task"); if let Err(e) = &res { info!("/write request {req_id} SPAWN ERROR: {e:#?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; if let Err(e) = &res { info!("/write request {req_id} ERROR: {e:#?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; let elapsed = timer.elapsed(); info!("/write request {req_id} | resolve time: {elapsed:?}"); Result::<_, (StatusCode, String)>::Ok((TypedHeader(ContentType::json()), res)) diff --git a/bin/periphery/Cargo.toml b/bin/periphery/Cargo.toml index 4714b3016..5c8d37193 100644 --- a/bin/periphery/Cargo.toml +++ b/bin/periphery/Cargo.toml @@ -19,6 +19,15 @@ path = "src/main.rs" # local monitor_types.workspace = true logger.workspace = true +# mogh +async_timing_util.workspace = true +merge_config_files.workspace = true +parse_csl.workspace = true +termination_signal.workspace = true +run_command.workspace = true +svi.workspace = true +resolver_api.workspace = true +serror.workspace = true # external tokio.workspace = true axum.workspace = true @@ -34,11 +43,3 @@ simple_logger.workspace = true uuid.workspace = true sysinfo.workspace = true async-trait.workspace = true -# mogh -async_timing_util.workspace = true -merge_config_files.workspace = true -parse_csl.workspace = true -termination_signal.workspace = true -run_command.workspace = true -svi.workspace = true -resolver_api.workspace = true diff --git a/bin/periphery/src/main.rs b/bin/periphery/src/main.rs index 2df118bed..498d0fb56 100644 --- a/bin/periphery/src/main.rs +++ b/bin/periphery/src/main.rs @@ -10,6 +10,7 @@ use axum::{ }; use resolver_api::Resolver; +use serror::serialize_error; use termination_signal::tokio::immediate_term_handle; use uuid::Uuid; @@ -37,23 +38,19 @@ async fn app() -> anyhow::Result<()> { let timer = Instant::now(); let req_id = Uuid::new_v4(); info!("request {req_id} | {request:?}"); - let res = tokio::spawn(async move { - state - .resolve_request(request, ()) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))) - }) - .await - .context("failed in spawned request handler") - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e:#?}"))); + let res = tokio::spawn(async move { state.resolve_request(request, ()).await }) + .await + .context("failed in spawned request handler"); if let Err(e) = &res { - debug!("request {req_id} SPAWN ERROR: {e:?}"); + debug!("request {req_id} SPAWN ERROR: {e:#?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; if let Err(e) = &res { - debug!("request {req_id} ERROR: {e:?}"); + debug!("request {req_id} ERROR: {e:#?}"); } - let res = res?; + let res = + res.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, serialize_error(e)))?; let elapsed = timer.elapsed(); info!("request {req_id} | resolve time: {elapsed:?}"); debug!("request {req_id} RESPONSE: {res}");