This is an automated email from the ASF dual-hosted git repository.
maytasm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 8cc58a4 Add sql query id to response header for failed sql query
(#11756)
8cc58a4 is described below
commit 8cc58a4368428e155ba0d44490dfbbf4e98eb8fc
Author: Maytas Monsereenusorn <[email protected]>
AuthorDate: Thu Sep 30 13:43:39 2021 +0700
Add sql query id to response header for failed sql query (#11756)
* add impl
* add impl
---
.../org/apache/druid/sql/http/SqlResource.java | 17 ++++++----
.../org/apache/druid/sql/http/SqlResourceTest.java | 37 ++++++++++++++++++++++
2 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
b/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
index 2a070f4..6815292 100644
--- a/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
+++ b/sql/src/main/java/org/apache/druid/sql/http/SqlResource.java
@@ -73,6 +73,7 @@ import java.util.stream.Collectors;
@Path("/druid/v2/sql/")
public class SqlResource
{
+ public static final String SQL_QUERY_ID_RESPONSE_HEADER =
"X-Druid-SQL-Query-Id";
private static final Logger log = new Logger(SqlResource.class);
private final ObjectMapper jsonMapper;
@@ -164,7 +165,7 @@ public class SqlResource
}
}
)
- .header("X-Druid-SQL-Query-Id", sqlQueryId)
+ .header(SQL_QUERY_ID_RESPONSE_HEADER, sqlQueryId)
.build();
}
catch (Throwable e) {
@@ -175,19 +176,19 @@ public class SqlResource
}
catch (QueryCapacityExceededException cap) {
endLifecycle(sqlQueryId, lifecycle, cap, remoteAddr, -1);
- return buildNonOkResponse(QueryCapacityExceededException.STATUS_CODE,
cap);
+ return buildNonOkResponse(QueryCapacityExceededException.STATUS_CODE,
cap, sqlQueryId);
}
catch (QueryUnsupportedException unsupported) {
endLifecycle(sqlQueryId, lifecycle, unsupported, remoteAddr, -1);
- return buildNonOkResponse(QueryUnsupportedException.STATUS_CODE,
unsupported);
+ return buildNonOkResponse(QueryUnsupportedException.STATUS_CODE,
unsupported, sqlQueryId);
}
catch (QueryTimeoutException timeout) {
endLifecycle(sqlQueryId, lifecycle, timeout, remoteAddr, -1);
- return buildNonOkResponse(QueryTimeoutException.STATUS_CODE, timeout);
+ return buildNonOkResponse(QueryTimeoutException.STATUS_CODE, timeout,
sqlQueryId);
}
catch (SqlPlanningException | ResourceLimitExceededException e) {
endLifecycle(sqlQueryId, lifecycle, e, remoteAddr, -1);
- return buildNonOkResponse(BadQueryException.STATUS_CODE, e);
+ return buildNonOkResponse(BadQueryException.STATUS_CODE, e, sqlQueryId);
}
catch (ForbiddenException e) {
endLifecycleWithoutEmittingMetrics(sqlQueryId, lifecycle);
@@ -207,7 +208,8 @@ public class SqlResource
return buildNonOkResponse(
Status.INTERNAL_SERVER_ERROR.getStatusCode(),
- QueryInterruptedException.wrapIfNeeded(exceptionToReport)
+ QueryInterruptedException.wrapIfNeeded(exceptionToReport),
+ sqlQueryId
);
}
finally {
@@ -235,7 +237,7 @@ public class SqlResource
sqlLifecycleManager.remove(sqlQueryId, lifecycle);
}
- private Response buildNonOkResponse(int status, SanitizableException e)
throws JsonProcessingException
+ private Response buildNonOkResponse(int status, SanitizableException e,
String sqlQueryId) throws JsonProcessingException
{
return Response.status(status)
.type(MediaType.APPLICATION_JSON_TYPE)
@@ -244,6 +246,7 @@ public class SqlResource
serverConfig.getErrorResponseTransformStrategy().transformIfNeeded(e)
)
)
+ .header(SQL_QUERY_ID_RESPONSE_HEADER, sqlQueryId)
.build();
}
diff --git a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
index f52335d..6da9ccb 100644
--- a/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/http/SqlResourceTest.java
@@ -22,6 +22,7 @@ package org.apache.druid.sql.http;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
@@ -88,6 +89,7 @@ import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;
@@ -974,6 +976,41 @@ public class SqlResourceTest extends CalciteTestBase
}
@Test
+ public void testErrorResponseReturnSameQueryIdWhenSetInContext() throws
Exception
+ {
+ String queryId = "id123";
+ String errorMessage = "This will be support in Druid 9999";
+ SqlQuery badQuery = EasyMock.createMock(SqlQuery.class);
+ EasyMock.expect(badQuery.getQuery()).andReturn("SELECT ANSWER TO LIFE");
+
EasyMock.expect(badQuery.getContext()).andReturn(ImmutableMap.of("sqlQueryId",
queryId));
+ EasyMock.expect(badQuery.getParameterList()).andThrow(new
QueryUnsupportedException(errorMessage));
+ EasyMock.replay(badQuery);
+ final Response response = resource.doPost(badQuery, req);
+ Assert.assertNotEquals(200, response.getStatus());
+ final MultivaluedMap<String, Object> headers = response.getMetadata();
+
Assert.assertTrue(headers.containsKey(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER));
+ Assert.assertEquals(1,
headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).size());
+ Assert.assertEquals(queryId,
headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).get(0));
+ }
+
+ @Test
+ public void testErrorResponseReturnNewQueryIdWhenNotSetInContext() throws
Exception
+ {
+ String errorMessage = "This will be support in Druid 9999";
+ SqlQuery badQuery = EasyMock.createMock(SqlQuery.class);
+ EasyMock.expect(badQuery.getQuery()).andReturn("SELECT ANSWER TO LIFE");
+ EasyMock.expect(badQuery.getContext()).andReturn(ImmutableMap.of());
+ EasyMock.expect(badQuery.getParameterList()).andThrow(new
QueryUnsupportedException(errorMessage));
+ EasyMock.replay(badQuery);
+ final Response response = resource.doPost(badQuery, req);
+ Assert.assertNotEquals(200, response.getStatus());
+ final MultivaluedMap<String, Object> headers = response.getMetadata();
+
Assert.assertTrue(headers.containsKey(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER));
+ Assert.assertEquals(1,
headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).size());
+
Assert.assertFalse(Strings.isNullOrEmpty(headers.get(SqlResource.SQL_QUERY_ID_RESPONSE_HEADER).get(0).toString()));
+ }
+
+ @Test
public void testUnsupportedQueryThrowsExceptionWithFilterResponse() throws
Exception
{
resource = new SqlResource(
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]