implement serror for core and periphery errors

This commit is contained in:
mbecker20
2023-08-27 01:36:19 -04:00
parent 80e5879c43
commit dc6c391798
9 changed files with 69 additions and 47 deletions

23
Cargo.lock generated
View File

@@ -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"

View File

@@ -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"] }

View File

@@ -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

View File

@@ -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}");

View File

@@ -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))

View File

@@ -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))

View File

@@ -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))

View File

@@ -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

View File

@@ -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}");