From eeb48f0c26ccc5162430eddec24adc2601eb5f99 Mon Sep 17 00:00:00 2001 From: hugocasa Date: Thu, 22 Oct 2026 16:34:08 +0200 Subject: [PATCH] feat: add job_id and flow_path to flow step error objects (#11941) * feat: add job_id to step error objects in bun, deno, python and php wrappers Co-Authored-By: Claude Opus 5.5 * feat: add job_id to the duckdb data-test step error Co-Authored-By: Claude Opus 5.5 * feat: add flow_path to step error objects Co-Authored-By: Claude Opus 5.5 * fix: close the job_id guard before flow_path in the deno wrapper Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- backend/windmill-worker/src/bun_executor.rs | 16 ++++++++++++++++ backend/windmill-worker/src/deno_executor.rs | 8 ++++++++ backend/windmill-worker/src/duckdb_executor.rs | 2 ++ backend/windmill-worker/src/php_executor.rs | 8 ++++++++ backend/windmill-worker/src/python_executor.rs | 12 ++++++++++++ 5 files changed, 46 insertions(+) diff --git a/backend/windmill-worker/src/bun_executor.rs b/backend/windmill-worker/src/bun_executor.rs index 7d78958775..0094328927 100644 --- a/backend/windmill-worker/src/bun_executor.rs +++ b/backend/windmill-worker/src/bun_executor.rs @@ -2828,6 +2828,14 @@ try {{ if (step_id) {{ err["step_id"] = step_id; }} + let job_id = process.env.WM_JOB_ID; + if (job_id) {{ + err["job_id"] = job_id; + }} + let flow_path = process.env.WM_FLOW_PATH; + if (flow_path) {{ + err["flow_path"] = flow_path; + }} const extra = {{}}; Object.getOwnPropertyNames(e).forEach((key) => {{ if (['line', 'name', 'stack', 'column', 'message', 'sourceURL', 'originalLine', 'originalColumn'].includes(key)) {{ @@ -2894,6 +2902,14 @@ try {{ if (step_id) {{ err["step_id"] = step_id; }} + let job_id = process.env.WM_JOB_ID; + if (job_id) {{ + err["job_id"] = job_id; + }} + let flow_path = process.env.WM_FLOW_PATH; + if (flow_path) {{ + err["flow_path"] = flow_path; + }} const extra = {{}}; Object.getOwnPropertyNames(e).forEach((key) => {{ if (['line', 'name', 'stack', 'column', 'message', 'sourceURL', 'originalLine', 'originalColumn'].includes(key)) {{ diff --git a/backend/windmill-worker/src/deno_executor.rs b/backend/windmill-worker/src/deno_executor.rs index 58388c3cfd..881923f299 100644 --- a/backend/windmill-worker/src/deno_executor.rs +++ b/backend/windmill-worker/src/deno_executor.rs @@ -387,6 +387,14 @@ try {{ if (step_id) {{ err["step_id"] = step_id; }} + let job_id = Deno.env.get("WM_JOB_ID"); + if (job_id) {{ + err["job_id"] = job_id; + }} + let flow_path = Deno.env.get("WM_FLOW_PATH"); + if (flow_path) {{ + err["flow_path"] = flow_path; + }} await Deno.writeTextFile("result.json", JSON.stringify(err)); Deno.exit(1); }} diff --git a/backend/windmill-worker/src/duckdb_executor.rs b/backend/windmill-worker/src/duckdb_executor.rs index 05c35fce8d..0db954d85f 100644 --- a/backend/windmill-worker/src/duckdb_executor.rs +++ b/backend/windmill-worker/src/duckdb_executor.rs @@ -1792,6 +1792,8 @@ pub async fn do_duckdb( return Err(Error::ExecutionRawError(to_raw_value(&json!({ "message": message, "name": "ExecutionErr", + "flow_path": reserved_variables.get("WM_FLOW_PATH").filter(|p| !p.is_empty()), + "job_id": job.id, "step_id": job.flow_step_id, "data_tests": data_tests, })))); diff --git a/backend/windmill-worker/src/php_executor.rs b/backend/windmill-worker/src/php_executor.rs index bc4583d11e..fad3a7ce56 100644 --- a/backend/windmill-worker/src/php_executor.rs +++ b/backend/windmill-worker/src/php_executor.rs @@ -529,6 +529,14 @@ try {{ if ($step_id) {{ $err["step_id"] = $step_id; }} + $job_id = getenv('WM_JOB_ID'); + if ($job_id) {{ + $err["job_id"] = $job_id; + }} + $flow_path = getenv('WM_FLOW_PATH'); + if ($flow_path) {{ + $err["flow_path"] = $flow_path; + }} file_put_contents("result.json", json_encode($err)); exit(1); }} diff --git a/backend/windmill-worker/src/python_executor.rs b/backend/windmill-worker/src/python_executor.rs index 1dab4efa15..aea9bd4af6 100644 --- a/backend/windmill-worker/src/python_executor.rs +++ b/backend/windmill-worker/src/python_executor.rs @@ -1003,6 +1003,12 @@ except BaseException as e: flow_node_id = os.environ.get('WM_FLOW_STEP_ID') if flow_node_id: err['step_id'] = flow_node_id + job_id = os.environ.get('WM_JOB_ID') + if job_id: + err['job_id'] = job_id + flow_path = os.environ.get('WM_FLOW_PATH') + if flow_path: + err['flow_path'] = flow_path err_json = json.dumps(err, separators=(',', ':'), default=str).replace('\n', '') f.write(err_json) sys.exit(1) @@ -1073,6 +1079,12 @@ except BaseException as e: flow_node_id = os.environ.get('WM_FLOW_STEP_ID') if flow_node_id: err['step_id'] = flow_node_id + job_id = os.environ.get('WM_JOB_ID') + if job_id: + err['job_id'] = job_id + flow_path = os.environ.get('WM_FLOW_PATH') + if flow_path: + err['flow_path'] = flow_path err_json = json.dumps(err, separators=(',', ':'), default=str).replace('\n', '') f.write(err_json) sys.exit(1)