2016-01-13 28 views
1

我有一个Flume代理配置,我使用HTTPSource从特定服务接收事件数据。出于测试的目的,我将创建静态JSON结构作为Python中的字符串对象(名为data)(请参阅下面的代码片段1),并将该对象发送给带有适当头部的flume,但之后flume将返回400个错误的请求错误时间(见下面的片段2)。相关的水槽执行异常消息已在下面的代码片段3中提供。Flume HTTPSource拒绝由于malform导致的JSON体

问题:任何人都可以告诉我什么是我的静态JSON请求导致水槽HTTPSource拒绝它吗?是否还有其他问题可能会丢失,这与json数据无关?谢谢。

SNIPPET 1(Python脚本生成包含我的静态JSON数据虚设HTTP请求)

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 - 的Python脚本

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语句不被flume接受。它在json请求的body声明中使用了双配额,即使整个json strcuture都是有效的。奇怪的是,水槽用户指南根本没有触及这个。例如: [{“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具有一定的结构。对于HTTPSource接受事件的数组

JSONHandler:

这在JavaDocs of JSONHandler说明。如果由于格式不正确或其他原因导致反序列化失败,此 处理程序将抛出异​​常。每个事件都必须编码为具有 两个键值对的映射。

  1. 标题 - 此键值对的关键是“标题”。此键的值是另一个映射,它表示事件标题。这些 标题按原样插入到Flume事件中。

  2. body - 身体是代表事件主体的字符串。这个键值对的关键是“body”。所有键值对都被认为是头文件 。一个例子:

[{ “报头”:{ “一个”: “B”, “C”: “d”}, “体”: “random_body”},{ “报头”: { “e”:“f”},“body”:“random_body2”}]

相关问题