2016-01-13 1 views
1

У меня есть конфигурация 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) 
+0

Я думаю, что ничего не случилось с скриптом 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»}}] –

+0

Какая у вас конфигурация?Просто для того, чтобы узнать, какой обработчик вы используете в своем источнике Http. – frb

+0

Это jsonhandler ... –

ответ

0

Как отметил в своем комментарии @Martyn W, JSONHandler ожидает и подтверждает, что JSON имеет определенную структуру.

Это описано в JavaDocs of JSONHandler:

JSONHandler для HTTPSource, который принимает массив событий. Этот обработчик выдает исключение, если десериализация не выполняется из-за плохого формата или по любой другой причине. Каждое событие должно быть закодировано как карта с двумя парами ключ-значение.

  1. заголовки - ключом для этой пары ключ-значение является «заголовки». Значение для этого ключа - это другая карта, которая представляет заголовки событий. Эти заголовки вставляются в событие Flume как есть.

  2. body - Тело представляет собой строку, которая представляет собой тело события. Ключом для этой пары ключ-значение является «тело». Все пары ключ-значение - это , которые считаются заголовками. Пример:

[{ "заголовки": { "а": "б", "в": "г"}, "тело": "random_body"}, { "заголовки": { «e»: «f»}, «body»: «random_body2»}]