風邪でお酒が飲めなくてむしゃくしゃしてやってます←
fluentdで何か入力を受け取って、それをhttpでどこかに飛ばすということをしてみようと思います。
fluent output httpとぐぐったらそれっぽいものが!
流れはこちら
1. fluentd + dummerインストール
2. fluent-plugint-out-httpをインストール
3. エンドポイントの作成
4. fluentd.confの設定
5. 実験
1. fluentd + dummerインストール
fluentdとdummerをgem installします。
細かいことはこちら参考にしてください。
arata.hatenadiary.com
2. fluent-plugint-out-httpをインストール
$cd /path/to/workspace $fluent-gem install fluent-plugin-out-http Fetching: thread_safe-0.3.5.gem (100%) Successfully installed thread_safe-0.3.5 Fetching: tzinfo-1.2.2.gem (100%) Successfully installed tzinfo-1.2.2 Fetching: tzinfo-data-1.2015.2.gem (100%) ...
これで利用可能みたいです。
簡単ですね。
インストール先を指定したい場合は fluent-gem install fluent-plugin-out-http --install-dir plugin のように出来るみたいです。
現在こんな状態です。
$tree . ├── dummer.conf ├── fluent.conf └── plugin 1 directory, 2 files
fluent.confはデフォルト、dummer.confはやはり下記を参考にしました。
3. エンドポイントの作成
超しょぼいエンドポイントを作りました。
歯ブラシ最高
POSTされたデータをres.txtに書き込むエンドポイントです。
serv.php
<?php $fp = fopen("res.txt", "w+"); fwrite($fp,print_r($_POST,true)); fclose($fp);
現状。
$tree . ├── dummer.conf ├── fluent.conf ├── plugin └── serv.php 1 directory, 3 files
4. fluentd.confの設定
単にhttpに流すだけですね。
methodなども指定できるようです。
とりあえずさっくりpostするだけです。
fluent.conf
<source> type tail format ltsv path ./dummy.log tag debug.http time_format "[%Y-%m-%d %H:%M:%S]" </source> <match debug.**> type http endpoint_url http://localhost:9000/ http_method post # default: post raise_on_error false # default: true </match>
dummerの設定も一応記載します。
dummer.conf
configure 'sample' do output "dummy.log" rate 500 delimiter "\t" labeled true field :id, type: :integer, countup: true, format: "%04d" field :time, type: :datetime, format: "[%Y-%m-%d %H:%M:%S]", random: false field :uri, type: :string, any: %w[/api/v1/people /api/v1/textdata] end
現状(変わらず)
$tree . ├── dummer.conf ├── fluent.conf ├── plugin └── serv.php 1 directory, 3 files
5. 実験
4つにターミナルを分割してやりました。
工夫もなにもありませんw
$php -S localhost:9000 serv.php PHP 5.6.4 Development Server started at Wed Apr 15 00:58:12 2015 Listening on http://localhost:9000 Document root is fluentd/http Press Ctrl-C to quit.
$fluentd -c fluent.conf 2015-04-15 00:58:24 +0900 [info]: reading config file path="fluent.conf" 2015-04-15 00:58:24 +0900 [info]: starting fluentd-0.12.7 2015-04-15 00:58:25 +0900 [info]: gem 'fluent-plugin-norikra' version '0.2.2' 2015-04-15 00:58:25 +0900 [info]: gem 'fluent-plugin-out-http' version '0.1.3' 2015-04-15 00:58:25 +0900 [info]: gem 'fluentd' version '0.12.7' 2015-04-15 00:58:25 +0900 [info]: gem 'fluentd' version '0.10.61' 2015-04-15 00:58:25 +0900 [info]: using configuration file: <ROOT> <source> type tail format ltsv path ./dummy.log tag debug.http time_format [%Y-%m-%d %H:%M:%S] </source> <match debug.**> type http endpoint_url http://localhost:9000/ http_method post raise_on_error false </match> </ROOT> 2015-04-15 00:58:25 +0900 [info]: adding match pattern="debug.**" type="http" 2015-04-15 00:58:25 +0900 [info]: adding source type="tail" 2015-04-15 00:58:25 +0900 [warn]: 'pos_file PATH' parameter is not set to a 'tail' source. 2015-04-15 00:58:25 +0900 [warn]: this parameter is highly recommended to save the position to resume tailing.
$dummer -c dummer.conf
$tail -f res.txt ... Array ( [id] => 0253 [uri] => /api/v1/people ) Array ( [id] => 0254 [uri] => /api/v1/textdata ) ...
res.txtにゴリゴリ書き込まれていました。
こんなかんじでhttpも連携できそうですね。
風邪引いて酒飲めないからと色々やりましたが、もうちょい複雑なことに試してみたりしたいですね。
6. 最後にハマったところ
途中一箇所ハマりました。
fluent.confのendpoint_urlの後ろに「/」を付けないとエラーが出てしまいました。
fluentというよりrubyのhttpクライアントのエラーですね。
<match debug.**> type http endpoint_url http://localhost:9000/ # endpoint_url http://localhost:9000 http_method post # default: post raise_on_error false # default: true </match>
上記のコメントアウトしている部分のようにするとエラーが出ました。
エラーは下の長いやつのような感じです。
こちらを参考にして原因がわかりました。
ありがとうございました。
2015-04-15 01:03:22 +0900 [warn]: emit transaction failed: error_class=ArgumentError error="HTTP request path is empty" tag="debug.http" 2015-04-15 01:03:22 +0900 [warn]: /usr/local/Cellar/ruby/2.2.0/lib/ruby/2.2.0/net/http/generic_request.rb:25:in `initialize' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/Cellar/ruby/2.2.0/lib/ruby/2.2.0/net/http/request.rb:14:in `initialize' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluent-plugin-out-http-0.1.3/lib/fluent/plugin/out_http.rb:89:in `new' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluent-plugin-out-http-0.1.3/lib/fluent/plugin/out_http.rb:89:in `create_request' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluent-plugin-out-http-0.1.3/lib/fluent/plugin/out_http.rb:127:in `handle_record' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluent-plugin-out-http-0.1.3/lib/fluent/plugin/out_http.rb:133:in `block in emit' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/event.rb:128:in `call' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/event.rb:128:in `block in each' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/event.rb:127:in `each' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/event.rb:127:in `each' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluent-plugin-out-http-0.1.3/lib/fluent/plugin/out_http.rb:132:in `emit' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/event_router.rb:88:in `emit_stream' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:229:in `receive_lines' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:320:in `call' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:320:in `wrap_receive_lines' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:513:in `call' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:513:in `on_notify' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:345:in `on_notify' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:430:in `call' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:430:in `on_timer' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/cool.io-1.3.0/lib/cool.io/loop.rb:88:in `run_once' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/cool.io-1.3.0/lib/cool.io/loop.rb:88:in `run' 2015-04-15 01:03:22 +0900 [warn]: /usr/local/lib/ruby/gems/2.2.0/gems/fluentd-0.12.7/lib/fluent/plugin/in_tail.rb:214:in `run'