From 31c23e5fe3ecb5912a47bc32775309daa77d5065 Mon Sep 17 00:00:00 2001 From: fzyzcjy <5236035+fzyzcjy@users.noreply.github.com> Date: Sat, 13 Dec 2025 13:27:06 +0800 Subject: [PATCH] Provide more fine grained error reason for reqwest error (#15032) --- sgl-model-gateway/src/routers/error.rs | 2 +- sgl-model-gateway/src/routers/http/router.rs | 63 +++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/sgl-model-gateway/src/routers/error.rs b/sgl-model-gateway/src/routers/error.rs index 035d8086a..7231c94d2 100644 --- a/sgl-model-gateway/src/routers/error.rs +++ b/sgl-model-gateway/src/routers/error.rs @@ -37,7 +37,7 @@ pub fn method_not_allowed(code: impl Into, message: impl Into) - create_error(StatusCode::METHOD_NOT_ALLOWED, code, message) } -fn create_error( +pub fn create_error( status: StatusCode, code: impl Into, message: impl Into, diff --git a/sgl-model-gateway/src/routers/http/router.rs b/sgl-model-gateway/src/routers/http/router.rs index 0cb028865..de1c17c83 100644 --- a/sgl-model-gateway/src/routers/http/router.rs +++ b/sgl-model-gateway/src/routers/http/router.rs @@ -112,9 +112,7 @@ impl Router { ), } } - Err(e) => { - error::internal_error("request_failed", format!("Request failed: {}", e)) - } + Err(e) => convert_reqwest_error(e), } } Err(e) => error::service_unavailable("no_workers", e), @@ -363,10 +361,7 @@ impl Router { } } Err(e) => { - last_response = Some(error::internal_error( - "request_failed", - format!("Request failed: {}", e), - )); + last_response = Some(convert_reqwest_error(e)); } } } @@ -506,7 +501,7 @@ impl Router { } } - return error::internal_error("request_failed", format!("Request failed: {}", e)); + return convert_reqwest_error(e); } }; @@ -666,6 +661,58 @@ fn decrement_load(w: &Arc) { RouterMetrics::set_running_requests(w.url(), w.load()); } +fn convert_reqwest_error(e: reqwest::Error) -> Response { + let url = e + .url() + .map(|u| u.to_string()) + .unwrap_or_else(|| "unknown".to_string()); + let message = format!("{}. URL: {}", e, url); + + // TODO improve error status code + let (status, code) = if let Some(upstream_status) = e.status() { + (upstream_status, "call_upstream_status_error") + } else if e.is_builder() { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_builder_error", + ) + } else if e.is_request() { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_request_error", + ) + } else if e.is_redirect() { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_redirect_error", + ) + } else if e.is_body() { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_body_error", + ) + } else if e.is_decode() { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_decode_error", + ) + } else if e.is_timeout() { + (StatusCode::INTERNAL_SERVER_ERROR, "call_upstream_timeout") + } else if e.is_connect() { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_connection_failed", + ) + } else { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "call_upstream_request_failed", + ) + }; + + error::create_error(status, code, message) +} + use async_trait::async_trait; #[async_trait]