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)

Reply via email to