У меня есть конфигурация Flume agent, где я использую HTTPSource для получения данных о событиях из определенных служб. В целях тестирования я создаю статическую структуру JSON как строковый объект с именем data в Python (см. Фрагмент кода 1 ниже) и отправляю объект в flume с соответствующим заголовком, но затем flume возвращает мне ошибку с ошибкой в 400 ошибок. (см. фрагмент 2 ниже). Соответствующее сообщение об исключении выполнения потока связано с фрагментом 3 ниже.Flume HTTPSource отказывается от корпуса JSON из-за неправильной формы
Вопрос: Может ли кто-нибудь сказать мне, что случилось с моим статическим запросом json, который вызывает отказ от HTTPSource от Flute? Есть ли какая-то другая проблема, которая может отсутствовать, что не имеет отношения к данным json? Благодарю.
SNIPPET 1 (Python скрипт генерации запроса на фиктивную HTTP, содержащий мои статические данные JSON)
import urllib2, json
serviceName = "serviceA"
timestamp = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
body = "{ \"service\":\"" + serviceName + "\" }"
print("BODY: " + body)
//My JSON data
data = "[{ \"headers\" : { \"timestamp\" : \"" + timestamp + "\" }, \"body\" : " + body + " }]"
print("DATA: " + data)
req = urllib2.Request("http://10.1.0.100:5140")
req.add_header('Content-Type', 'application/json')
response = urllib2.urlopen(req, data)
SNIPPET 2 - выполнение Вывод питона сценария
BODY: { "service":"serviceA" }
DATA: [{ "headers" : { "timestamp" : "2016-01-13 12:26:48" }, "body" : { "service":"serviceA" } }]
Traceback (most recent call last):
File "./event_data_gen.py", line 57, in <module>
response = urllib2.urlopen(req, data)
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad request from client.
Request has invalid JSON Syntax.
SNIPPET 3 - Сообщение об исключении в исполнении выполнения Flume
2016-01-13 12:26:48,653 ([email protected])
[WARN - org.apache.flume.source.http.HTTPSource$FlumeHTTPServlet.doPost(HTTPSource.java: 242)] Received bad request from client.
org.apache.flume.source.http.HTTPBadRequestException: Request has invalid JSON Syntax.
at org.apache.flume.source.http.JSONHandler.getEvents(JSONHandler.java:119)
at org.apache.flume.source.http.HTTPSource$FlumeHTTPServlet.doPost(HTTPSource.java:240)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:814)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 67
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
at com.google.gson.Gson.fromJson(Gson.java:795)
at com.google.gson.Gson.fromJson(Gson.java:761)
at org.apache.flume.source.http.JSONHandler.getEvents(JSONHandler.java:117)
... 17 more
Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 67
at com.google.gson.stream.JsonReader.nextString(JsonReader.java:464)
at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:349)
at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:337)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
Я думаю, что ничего не случилось с скриптом python или данными. Действительные json-заявления не принимаются ломом каким-то образом. Он беспокоится об использовании двойной квоты в выражении тела запроса json, даже если весь json strcuture действителен. Странно, что руководство пользователя муфты не касается этого вообще. Follwoing действительный запрос JSON не принимается ломом, например: [{"headers": {"timestamp": "2016-01-13 15:21:31"}, "body": {"from": «device1», «user»: «Mehmet», «vendor»: «TELIA», «service»: «serviceA», «function»: «scale-out», «description»: «REASON TEXT 1»}}] –
Какая у вас конфигурация?Просто для того, чтобы узнать, какой обработчик вы используете в своем источнике Http. – frb
Это jsonhandler ... –