Skip to content

Commit cd245ea

Browse files
authored
Merge pull request #423 from obeli-sk/add-logging-to-wit-errors
logging(WASM,JS): Add `obelisk:log` logging to WIT error returns
2 parents a482c44 + 6788aea commit cd245ea

2 files changed

Lines changed: 77 additions & 66 deletions

File tree

crates/wasm-workers/src/webhook/webhook_trigger.rs

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use hyper::body::Bytes;
2929
use hyper::server::conn::http1;
3030
use hyper::{Method, StatusCode, Uri};
3131
use hyper_util::rt::TokioIo;
32+
use log_activities::obelisk::log::log::Host;
3233
use route_recognizer::{Match, Router};
3334
use std::ops::Deref;
3435
use std::str::FromStr;
@@ -655,10 +656,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
655656
let execution_id = match concepts::ExecutionId::from_str(&execution_id.id) {
656657
Ok(id) => id,
657658
Err(err) => {
658-
return Err(ScheduleJsonError::FfqnParsingError(format!(
659-
"invalid execution ID: {err}"
660-
))
661-
.into());
659+
let msg = format!("schedule-json: invalid execution ID: {err}");
660+
self.error(msg.clone());
661+
return Err(ScheduleJsonError::FfqnParsingError(msg).into());
662662
}
663663
};
664664

@@ -667,30 +667,31 @@ impl WebhookSupportHost for WebhookEndpointCtx {
667667
match FunctionFqn::try_from_tuple(&function.interface_name, &function.function_name) {
668668
Ok(ffqn) => ffqn,
669669
Err(err) => {
670-
return Err(ScheduleJsonError::FfqnParsingError(err.to_string()).into());
670+
let msg = format!("schedule-json: invalid function name: {err}");
671+
self.error(msg.clone());
672+
return Err(ScheduleJsonError::FfqnParsingError(msg).into());
671673
}
672674
};
673675

674676
// Look up function in registry
675677
let Some((fn_metadata, component_id)) = self.fn_registry.get_by_exported_function(&ffqn)
676678
else {
679+
self.error("schedule-json: function not found".to_string());
677680
return Err(ScheduleJsonError::FunctionNotFound.into());
678681
};
679682

680683
// Parse params JSON array
681684
let params_json: Vec<serde_json::Value> = match serde_json::from_str(&params) {
682685
Ok(serde_json::Value::Array(arr)) => arr,
683686
Ok(_) => {
684-
return Err(ScheduleJsonError::TypeCheckError(
685-
"params must be a JSON array".to_string(),
686-
)
687-
.into());
687+
let msg = "schedule-json: params must be a JSON array".to_string();
688+
self.error(msg.clone());
689+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
688690
}
689691
Err(err) => {
690-
return Err(ScheduleJsonError::TypeCheckError(format!(
691-
"cannot parse params as JSON: {err}"
692-
))
693-
.into());
692+
let msg = format!("schedule-json: cannot parse params as JSON: {err}");
693+
self.error(msg.clone());
694+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
694695
}
695696
};
696697

@@ -704,10 +705,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
704705
) {
705706
Ok(params) => params,
706707
Err(err) => {
707-
return Err(ScheduleJsonError::TypeCheckError(format!(
708-
"params type checking failed: {err}"
709-
))
710-
.into());
708+
let msg = format!("schedule-json: params type checking failed: {err}");
709+
self.error(msg.clone());
710+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
711711
}
712712
};
713713

@@ -717,10 +717,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
717717
let schedule_at = match history_event_schedule_at.as_date_time(created_at) {
718718
Ok(dt) => dt,
719719
Err(err) => {
720-
return Err(ScheduleJsonError::TypeCheckError(format!(
721-
"invalid schedule-at: {err:?}"
722-
))
723-
.into());
720+
let msg = format!("schedule-json: invalid schedule-at: {err}");
721+
self.error(msg.clone());
722+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
724723
}
725724
};
726725

@@ -807,30 +806,31 @@ impl WebhookSupportHost for WebhookEndpointCtx {
807806
match FunctionFqn::try_from_tuple(&function.interface_name, &function.function_name) {
808807
Ok(ffqn) => ffqn,
809808
Err(err) => {
810-
return Err(ScheduleJsonError::FfqnParsingError(err.to_string()).into());
809+
let msg = format!("call-json: invalid function name: {err}");
810+
self.error(msg.clone());
811+
return Err(ScheduleJsonError::FfqnParsingError(msg).into());
811812
}
812813
};
813814

814815
// Look up function in registry
815816
let Some((fn_metadata, component_id)) = self.fn_registry.get_by_exported_function(&ffqn)
816817
else {
818+
self.error("call-json: function not found".to_string());
817819
return Err(ScheduleJsonError::FunctionNotFound.into());
818820
};
819821

820822
// Parse params JSON array
821823
let params_json: Vec<serde_json::Value> = match serde_json::from_str(&params) {
822824
Ok(serde_json::Value::Array(arr)) => arr,
823825
Ok(_) => {
824-
return Err(ScheduleJsonError::TypeCheckError(
825-
"params must be a JSON array".to_string(),
826-
)
827-
.into());
826+
let msg = "call-json: params must be a JSON array".to_string();
827+
self.error(msg.clone());
828+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
828829
}
829830
Err(err) => {
830-
return Err(ScheduleJsonError::TypeCheckError(format!(
831-
"cannot parse params as JSON: {err}"
832-
))
833-
.into());
831+
let msg = format!("call-json: cannot parse params as JSON: {err}");
832+
self.error(msg.clone());
833+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
834834
}
835835
};
836836

@@ -844,10 +844,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
844844
) {
845845
Ok(params) => params,
846846
Err(err) => {
847-
return Err(ScheduleJsonError::TypeCheckError(format!(
848-
"params type checking failed: {err}"
849-
))
850-
.into());
847+
let msg = format!("call-json: params type checking failed: {err}");
848+
self.error(msg.clone());
849+
return Err(ScheduleJsonError::TypeCheckError(msg).into());
851850
}
852851
};
853852

@@ -989,7 +988,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
989988
let execution_id = match concepts::ExecutionId::from_str(&execution_id.id) {
990989
Ok(id) => id,
991990
Err(err) => {
992-
return Err(GetStatusError::ExecutionIdParsingError(err.to_string()).into());
991+
let msg = format!("get-status: cannot parse execution ID: {err}");
992+
self.error(msg.clone());
993+
return Err(GetStatusError::ExecutionIdParsingError(msg).into());
993994
}
994995
};
995996

@@ -1054,7 +1055,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
10541055
match concepts::ExecutionId::from_str(&execution_id.id) {
10551056
Ok(id) => id,
10561057
Err(err) => {
1057-
return Err(GetError::ExecutionIdParsingError(err.to_string()).into());
1058+
let msg = format!("get: cannot parse execution ID: {err}");
1059+
self.error(msg.clone());
1060+
return Err(GetError::ExecutionIdParsingError(msg).into());
10581061
}
10591062
};
10601063

@@ -1103,7 +1106,9 @@ impl WebhookSupportHost for WebhookEndpointCtx {
11031106
match concepts::ExecutionId::from_str(&execution_id.id) {
11041107
Ok(id) => id,
11051108
Err(err) => {
1106-
return Err(TryGetError::ExecutionIdParsingError(err.to_string()).into());
1109+
let msg = format!("try-get: cannot parse execution ID: {err}");
1110+
self.error(msg.clone());
1111+
return Err(TryGetError::ExecutionIdParsingError(msg).into());
11071112
}
11081113
};
11091114

@@ -1122,6 +1127,7 @@ impl WebhookSupportHost for WebhookEndpointCtx {
11221127
{
11231128
Ok(state) => state,
11241129
Err(DbErrorRead::NotFound) => {
1130+
self.error(format!("try-get: execution not found: {}", execution_id.id));
11251131
return Err(TryGetError::NotFound.into());
11261132
}
11271133
Err(err) => {

crates/wasm-workers/src/workflow/workflow_ctx.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ use concepts::{
3838
use concepts::{FunctionFqn, Params};
3939
use concepts::{JoinSetId, JoinSetKind};
4040
use executor::worker::FatalError;
41+
use log_activities::obelisk::log::log::Host;
4142
use rand::SeedableRng;
4243
use rand::rngs::StdRng;
4344
use std::fmt::Debug;
@@ -1382,10 +1383,9 @@ impl WorkflowCtx {
13821383
let execution_id = match ExecutionId::try_from(execution_id) {
13831384
Ok(id) => id,
13841385
Err(err) => {
1385-
let wit_result = Err(ScheduleJsonError::FfqnParsingError(format!(
1386-
"invalid execution ID: {err}"
1387-
)));
1388-
return Ok((wit_result,));
1386+
let msg = format!("schedule-json: invalid execution ID: {err}");
1387+
host.error(msg.clone());
1388+
return Ok((Err(ScheduleJsonError::FfqnParsingError(msg)),));
13891389
}
13901390
};
13911391
let ffqn = match FunctionFqn::try_from_tuple(
@@ -1394,9 +1394,9 @@ impl WorkflowCtx {
13941394
) {
13951395
Ok(ffqn) => ffqn,
13961396
Err(err) => {
1397-
let wit_result =
1398-
Err(ScheduleJsonError::FfqnParsingError(err.to_string()));
1399-
return Ok((wit_result,));
1397+
let msg = format!("schedule-json: invalid function name: {err}");
1398+
host.error(msg.clone());
1399+
return Ok((Err(ScheduleJsonError::FfqnParsingError(msg)),));
14001400
}
14011401
};
14021402
let wit_result = host
@@ -1429,9 +1429,9 @@ impl WorkflowCtx {
14291429
Ok(ffqn) => ffqn,
14301430
Err(err) => {
14311431
use latest::obelisk::workflow::workflow_support::ScheduleJsonError;
1432-
return Ok((Err(ScheduleJsonError::FfqnParsingError(
1433-
err.to_string(),
1434-
)),));
1432+
let msg = format!("call-json: invalid function name: {err}");
1433+
host.error(msg.clone());
1434+
return Ok((Err(ScheduleJsonError::FfqnParsingError(msg)),));
14351435
}
14361436
};
14371437
let wit_result = host.call_json(ffqn, params, backtrace).await?;
@@ -1870,6 +1870,7 @@ pub(crate) mod workflow_support {
18701870
use super::{
18711871
Schedule, Stub, SubmitChildExecution, WorkflowCtx, WorkflowFunctionError, typesTypes,
18721872
};
1873+
use crate::component_logger::log_activities::obelisk::log::log::Host as LogHost;
18731874
use crate::workflow::event_history::{
18741875
JoinNext, JoinNextTry, Persist, ScheduleIntent, StubIntent, StubIntentErr, StubParams,
18751876
SubmitDelay,
@@ -2313,14 +2314,14 @@ pub(crate) mod workflow_support {
23132314
let params_json = match serde_json::from_str(&params_json) {
23142315
Ok(serde_json::Value::Array(params)) => params,
23152316
Ok(_other) => {
2316-
return Ok(Err(ScheduleJsonError::TypeCheckError(
2317-
"params must be a json array".to_string(),
2318-
)));
2317+
let msg = "schedule-json: params must be a json array".to_string();
2318+
self.error(msg.clone());
2319+
return Ok(Err(ScheduleJsonError::TypeCheckError(msg)));
23192320
}
23202321
Err(err) => {
2321-
return Ok(Err(ScheduleJsonError::TypeCheckError(format!(
2322-
"cannot parse params as JSON array: {err}"
2323-
))));
2322+
let msg = format!("schedule-json: cannot parse params as JSON array: {err}");
2323+
self.error(msg.clone());
2324+
return Ok(Err(ScheduleJsonError::TypeCheckError(msg)));
23242325
}
23252326
};
23262327

@@ -2342,9 +2343,11 @@ pub(crate) mod workflow_support {
23422343
match result {
23432344
Ok(()) => Ok(Ok(())),
23442345
Err(ScheduleRequestError::FunctionNotFound) => {
2346+
self.error("schedule-json: function not found".to_string());
23452347
Ok(Err(ScheduleJsonError::FunctionNotFound))
23462348
}
23472349
Err(ScheduleRequestError::TypeCheckError(msg)) => {
2350+
self.error(format!("schedule-json: type check error: {msg}"));
23482351
Ok(Err(ScheduleJsonError::TypeCheckError(msg)))
23492352
}
23502353
}
@@ -2528,15 +2531,15 @@ pub(crate) mod workflow_support {
25282531
let target_execution_id = match ExecutionId::try_from(target_execution_id) {
25292532
Ok(ExecutionId::Derived(derived)) => derived,
25302533
Ok(ExecutionId::TopLevel(_)) => {
2531-
return Ok(Err(StubJsonError::ExecutionIdParsingError(
2532-
"execution-id must be a derived (child) execution ID, not a top-level one"
2533-
.to_string(),
2534-
)));
2534+
let msg = "stub-json: execution-id must be a derived (child) execution ID, not a top-level one"
2535+
.to_string();
2536+
self.error(msg.clone());
2537+
return Ok(Err(StubJsonError::ExecutionIdParsingError(msg)));
25352538
}
25362539
Err(err) => {
2537-
return Ok(Err(StubJsonError::ExecutionIdParsingError(format!(
2538-
"cannot parse execution-id: {err}"
2539-
))));
2540+
let msg = format!("stub-json: cannot parse execution-id: {err}");
2541+
self.error(msg.clone());
2542+
return Ok(Err(StubJsonError::ExecutionIdParsingError(msg)));
25402543
}
25412544
};
25422545

@@ -2583,14 +2586,14 @@ pub(crate) mod workflow_support {
25832586
let params_json_arr = match serde_json::from_str(&params_json) {
25842587
Ok(serde_json::Value::Array(params)) => params,
25852588
Ok(_other) => {
2586-
return Ok(Err(ScheduleJsonError::TypeCheckError(
2587-
"params must be a json array".to_string(),
2588-
)));
2589+
let msg = "call-json: params must be a json array".to_string();
2590+
self.error(msg.clone());
2591+
return Ok(Err(ScheduleJsonError::TypeCheckError(msg)));
25892592
}
25902593
Err(err) => {
2591-
return Ok(Err(ScheduleJsonError::TypeCheckError(format!(
2592-
"cannot parse params as JSON array: {err}"
2593-
))));
2594+
let msg = format!("call-json: cannot parse params as JSON array: {err}");
2595+
self.error(msg.clone());
2596+
return Ok(Err(ScheduleJsonError::TypeCheckError(msg)));
25942597
}
25952598
};
25962599

@@ -2602,9 +2605,11 @@ pub(crate) mod workflow_support {
26022605
params,
26032606
} => (fn_component_id, params),
26042607
SubmitChildIntent::Err(ChildExecutionRequestError::FunctionNotFound) => {
2608+
self.error(format!("call-json: function not found: {target_ffqn}"));
26052609
return Ok(Err(ScheduleJsonError::FunctionNotFound));
26062610
}
26072611
SubmitChildIntent::Err(ChildExecutionRequestError::TypeCheckError(msg)) => {
2612+
self.error(format!("call-json: type check error: {msg}"));
26082613
return Ok(Err(ScheduleJsonError::TypeCheckError(msg)));
26092614
}
26102615
};

0 commit comments

Comments
 (0)