This is an automated email from the ASF dual-hosted git repository.

feiwang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git


The following commit(s) were added to refs/heads/master by this push:
     new 745e3a4d6 [KYUUBI #5056] [REST] Return more helpful error message to 
http client
745e3a4d6 is described below

commit 745e3a4d658b314b6fec422665571b6a93cb4f08
Author: fwang12 <[email protected]>
AuthorDate: Sat Jul 15 13:16:11 2023 +0800

    [KYUUBI #5056] [REST] Return more helpful error message to http client
    
    ### _Why are the changes needed?_
    
    Return mode helpful information to http client side.
    
    Before this pr, the exception stack is only visible in server side log.
    
    ### _How was this patch tested?_
    - [ ] Add some test cases that check the changes thoroughly including 
negative and positive cases if possible
    
    - [ ] Add screenshots for manual tests if appropriate
    
    - [x] [Run 
test](https://kyuubi.readthedocs.io/en/master/contributing/code/testing.html#running-tests)
 locally before make a pull request
    
    Closes #5056 from turboFei/info_err.
    
    Closes #5056
    
    cdda80557 [fwang12] refine
    2da2b2072 [fwang12] pretty print
    
    Authored-by: fwang12 <[email protected]>
    Signed-off-by: fwang12 <[email protected]>
---
 .../org/apache/kyuubi/server/api/ApiUtils.scala    |  9 ++++-
 .../kyuubi/server/api/v1/OperationsResource.scala  | 18 ++++-----
 .../kyuubi/server/api/v1/SessionsResource.scala    | 43 +++++++++-------------
 3 files changed, 31 insertions(+), 39 deletions(-)

diff --git 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/ApiUtils.scala 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/ApiUtils.scala
index 6b01def5c..5aaf4d778 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/ApiUtils.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/ApiUtils.scala
@@ -19,14 +19,14 @@ package org.apache.kyuubi.server.api
 
 import scala.collection.JavaConverters._
 
-import org.apache.kyuubi.Utils
+import org.apache.kyuubi.{Logging, Utils}
 import org.apache.kyuubi.client.api.v1.dto.{OperationData, ServerData, 
SessionData}
 import org.apache.kyuubi.events.KyuubiOperationEvent
 import org.apache.kyuubi.ha.client.ServiceNodeInfo
 import org.apache.kyuubi.operation.KyuubiOperation
 import org.apache.kyuubi.session.KyuubiSession
 
-object ApiUtils {
+object ApiUtils extends Logging {
 
   def sessionData(session: KyuubiSession): SessionData = {
     val sessionEvent = session.getSessionEvent
@@ -71,4 +71,9 @@ object ApiUtils {
       nodeInfo.attributes.asJava,
       "Running")
   }
+
+  def logAndRefineErrorMsg(errorMsg: String, throwable: Throwable): String = {
+    error(errorMsg, throwable)
+    s"$errorMsg: ${Utils.prettyPrint(throwable)}"
+  }
 }
diff --git 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/OperationsResource.scala
 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/OperationsResource.scala
index b79ee27e3..ae5feea52 100644
--- 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/OperationsResource.scala
+++ 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/OperationsResource.scala
@@ -32,12 +32,13 @@ import org.apache.kyuubi.{KyuubiSQLException, Logging}
 import org.apache.kyuubi.client.api.v1.dto._
 import org.apache.kyuubi.events.KyuubiOperationEvent
 import org.apache.kyuubi.operation.{FetchOrientation, KyuubiOperation, 
OperationHandle}
-import org.apache.kyuubi.server.api.ApiRequestContext
+import org.apache.kyuubi.server.api.{ApiRequestContext, ApiUtils}
 
 @Tag(name = "Operation")
 @Produces(Array(MediaType.APPLICATION_JSON))
 @Consumes(Array(MediaType.APPLICATION_JSON))
 private[v1] class OperationsResource extends ApiRequestContext with Logging {
+  import ApiUtils.logAndRefineErrorMsg
 
   @ApiResponse(
     responseCode = "200",
@@ -57,8 +58,7 @@ private[v1] class OperationsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting an operation event"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -84,8 +84,7 @@ private[v1] class OperationsResource extends 
ApiRequestContext with Logging {
       case NonFatal(e) =>
         val errorMsg =
           s"Error applying ${request.getAction} for operation handle 
$operationHandleStr"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -124,8 +123,7 @@ private[v1] class OperationsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = s"Error getting result set metadata for operation 
handle $operationHandleStr"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -158,8 +156,7 @@ private[v1] class OperationsResource extends 
ApiRequestContext with Logging {
         throw e
       case NonFatal(e) =>
         val errorMsg = s"Error getting operation log for operation handle 
$operationHandleStr"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -240,8 +237,7 @@ private[v1] class OperationsResource extends 
ApiRequestContext with Logging {
         throw new BadRequestException(e.getMessage)
       case NonFatal(e) =>
         val errorMsg = s"Error getting result row set for operation handle 
$operationHandleStr"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 }
diff --git 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/SessionsResource.scala
 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/SessionsResource.scala
index bc480c027..10a557867 100644
--- 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/SessionsResource.scala
+++ 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/SessionsResource.scala
@@ -42,6 +42,8 @@ import org.apache.kyuubi.session.{KyuubiSession, 
SessionHandle}
 @Produces(Array(MediaType.APPLICATION_JSON))
 @Consumes(Array(MediaType.APPLICATION_JSON))
 private[v1] class SessionsResource extends ApiRequestContext with Logging {
+  import ApiUtils.logAndRefineErrorMsg
+
   implicit def toSessionHandle(str: String): SessionHandle = 
SessionHandle.fromUUID(str)
   private def sessionManager = fe.be.sessionManager
 
@@ -89,8 +91,8 @@ private[v1] class SessionsResource extends ApiRequestContext 
with Logging {
             .build).get
     } catch {
       case NonFatal(e) =>
-        error(s"Invalid $sessionHandleStr", e)
-        throw new NotFoundException(s"Invalid $sessionHandleStr")
+        val errorMsg = s"Invalid $sessionHandleStr"
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -112,8 +114,8 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
       new InfoDetail(info.toString, infoValue.getStringValue)
     } catch {
       case NonFatal(e) =>
-        error(s"Unrecognized GetInfoType value: $infoType", e)
-        throw new NotFoundException(s"Unrecognized GetInfoType value: 
$infoType")
+        val errorMsg = s"Unrecognized GetInfoType value: $infoType"
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -198,8 +200,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error executing statement"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -217,8 +218,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting type information"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -236,8 +236,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting catalogs"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -261,8 +260,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting schemas"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -287,8 +285,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting tables"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -306,8 +303,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting table types"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -332,8 +328,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting columns"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -357,8 +352,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting functions"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -382,8 +376,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting primary keys"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -410,8 +403,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting cross reference"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 
@@ -437,8 +429,7 @@ private[v1] class SessionsResource extends 
ApiRequestContext with Logging {
     } catch {
       case NonFatal(e) =>
         val errorMsg = "Error getting the list of all type operations belong 
to session"
-        error(errorMsg, e)
-        throw new NotFoundException(errorMsg)
+        throw new NotFoundException(logAndRefineErrorMsg(errorMsg, e))
     }
   }
 }

Reply via email to