Dustin Cote created KAFKA-4017:
----------------------------------
Summary: Return more helpful responses when misconfigured
connectors are submitted
Key: KAFKA-4017
URL: https://issues.apache.org/jira/browse/KAFKA-4017
Project: Kafka
Issue Type: Improvement
Components: KafkaConnect
Affects Versions: 0.10.0.0
Reporter: Dustin Cote
Assignee: Ewen Cheslack-Postava
Currently if a user submits a connector with a malformed configuration with
connect in distributed mode, the response is:
{code}
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 500 </title>
</head>
<body>
<h2>HTTP ERROR: 500</h2>
<p>Problem accessing /connectors. Reason:
<pre> Request failed.</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>
{code}
If the user decides to then go look at the connect server side logging, they
can maybe parse the stack traces to find out what happened, but are at first
greeted by:
{code}
[2016-08-03 16:14:07,797] WARN /connectors
(org.eclipse.jetty.server.HttpChannel:384)
java.lang.NoSuchMethodError:
javax.servlet.http.HttpServletRequest.isAsyncStarted()Z
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:684)
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at
org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:159)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:499)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
at
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
at
org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Thread.java:745)
{code}
It would be better if Connect can handle this scenario more gracefully and make
it more clear what the problem is even directly to the client. In the example
above, you can eventually locate the problem in the server logs as:
{code}
[2016-08-03 16:14:07,795] WARN (org.eclipse.jetty.servlet.ServletHandler:620)
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException:
com.fasterxml.jackson.databind.JsonMappingException: Unexpected character ('='
(code 61)): was expecting a colon to separate field name and value
at [Source:
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@20fb9cff;
line: 1, column: 147] (through reference chain:
org.apache.kafka.connect.runtime.rest.entities.CreateConnectorRequest["config"])
at
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489)
at
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
at
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
at
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
at
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at
org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:159)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:499)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
at
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
at
org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Thread.java:745)
{code}
The {quote} Unexpected character ('=' (code 61)): was expecting a colon to
separate field name and value {quote} should be what the client responds with
and a better error code than 500 which implies an internal server error. A 400
code would be more appropriate.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)