Fluent::Plugin::Http::Ex, a plugin for Fluentd
This plugin takes JSON or MessagePack of events as input via a single, list or chunked HTTP POST request and emits each as an individual event to your output plugins. If you're sending a lot of events this simplifies your client's code and eliminates the overhead of creating a lot of brief connections.
The ExHttpInput plugin uses the same settings you would use for the standard HTTP input plugin. Example:
<source>
type http_ex
port 8888
bind 0.0.0.0
body_size_limit 32m
keepalive_timeout 300s #0s is not timeout
</source>
Like the HTTP input plugin, the tag is determined by the URL used, which means all events in one request must have the same tag.
Have your logging system send JSON or Message of events. Example:
Base URL
http://localhost:8888
resource
j or null
header
Content-type: application/x-www-form-urlencoded
body
json=<json data>
sample
$ curl -X POST -d 'json={"action":"login","user":2}' \
http://localhost:8888/j/test.tag.here;
$ curl -X POST -d 'json={"action":"login","user":2}' \
http://localhost:8888/test.tag.here;
resource
j or null
header
Content-type: application/json
body
<json data>
sample
$ curl -X POST -H 'Content-Type: application/json' -d '{"action":"login","user":2}' \
http://localhost:8888/j/test.tag.here;
$ curl -X POST -H 'Content-Type: application/json' -d '{"action":"login","user":2}' \
http://localhost:8888/test.tag.here;
resource
js
header
Content-type: application/x-www-form-urlencoded
body
json=<json list data>
sample
$ curl -X POST -d 'json=[{"action":"login","user":2},{"action":"login","user":2}]' \
http://localhost:8888/js/test.tag.here;
resource
js
header
Content-type: application/json
body
json=<json list data>
sample
$ curl -X POST -d '[{"action":"login","user":2},{"action":"login","user":2}]' \
http://localhost:8888/js/test.tag.here;
resource
m or null
header
Content-type: application/x-www-form-urlencoded
body
msgpack=<hash msgpack data>
hash.to_msgpack
resource
m or null
header
Content-type: application/x-msgpack
body
<msgpack data>
hash.to_msgpack
resource
ms
header
Content-type: application/x-www-form-urlencoded
body
msgpack=<msgpack list data>
[hash,hash,hash].to_msgpack
resource
ms
header
Content-type: application/x-msgpack
body
msgpack=<msgpack list data>
[hash,hash,hash].to_msgpack
resource
ms
header
Content-type: application/x-msgpack
Transfer-Encoding: chunked
body
<msgpack chunk data>
"#{hash.to_msgpack}#{hash.to_msgpack}"...
Each event in the list will be sent to your output plugins as an individual event.
Comparison of in_http and in_http_ex. send 10,000 messages.
machine spec
Mac OS X 10.8.2
1.8 GHz Intel Core i5
8 GB 1600 MHz DDR3
json
$ time ruby examples/json.rb
real 2m27.480s
user 0m7.252s
sys 0m4.438s
msgpack
$ time ruby examples/msgpack.rb
real 2m36.408s
user 0m8.249s
sys 0m4.441s
json
$ time ruby examples/json.rb
real 2m30.639s
user 0m7.195s
sys 0m4.686s
msgpack
$ time ruby examples/msgpack.rb
real 2m28.442s
user 0m7.126s
sys 0m4.324s
json list
$ time ruby examples/json_list.rb
real 0m18.179s
user 0m0.872s
sys 0m0.477s
msgpack list
$ time ruby examples/msgpack_list.rb
real 0m13.787s
user 0m0.908s
sys 0m0.470s
msgpack chunked
$ time ruby examples/nc_chunked.rb
real 0m1.584s
user 0m0.244s
sys 0m0.107s
Copyright (c) 2013 hiro-su.
Based on the in_http plugin by FURUHASHI Sadayuki
Apache License, Version 2.0