diff --git a/libs/utils/src/http/error.rs b/libs/utils/src/http/error.rs
index b0ecb746d9..1ba0422993 100644
--- a/libs/utils/src/http/error.rs
+++ b/libs/utils/src/http/error.rs
@@ -1,6 +1,7 @@
use hyper::{header, Body, Response, StatusCode};
use serde::{Deserialize, Serialize};
use thiserror::Error;
+use tracing::error;
#[derive(Debug, Error)]
pub enum ApiError {
@@ -76,8 +77,16 @@ impl HttpErrorBody {
}
pub async fn handler(err: routerify::RouteError) -> Response
{
- tracing::error!("Error processing HTTP request: {:?}", err);
- err.downcast::()
- .expect("handler should always return api error")
- .into_response()
+ let api_error = err
+ .downcast::()
+ .expect("handler should always return api error");
+
+ // Print a stack trace for Internal Server errors
+ if let ApiError::InternalServerError(_) = api_error.as_ref() {
+ error!("Error processing HTTP request: {api_error:?}");
+ } else {
+ error!("Error processing HTTP request: {api_error:#}");
+ }
+
+ api_error.into_response()
}
diff --git a/test_runner/regress/test_tenant_detach.py b/test_runner/regress/test_tenant_detach.py
index db5bb679f2..ef6ac1527e 100644
--- a/test_runner/regress/test_tenant_detach.py
+++ b/test_runner/regress/test_tenant_detach.py
@@ -237,7 +237,7 @@ def test_tenant_detach_smoke(neon_env_builder: NeonEnvBuilder):
env = neon_env_builder.init_start()
pageserver_http = env.pageserver.http_client()
- env.pageserver.allowed_errors.append(".*NotFound\\(Tenant .* not found")
+ env.pageserver.allowed_errors.append(".*NotFound: Tenant .* not found")
# first check for non existing tenant
tenant_id = TenantId.generate()