日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

fluentdのhttp-pluginを試してみただけの日記

風邪でお酒が飲めなくてむしゃくしゃしてやってます←
fluentdで何か入力を受け取って、それをhttpでどこかに飛ばすということをしてみようと思います。
fluent output httpとぐぐったらそれっぽいものが!

github.com

流れはこちら

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はやはり下記を参考にしました。

qiita.com

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>

上記のコメントアウトしている部分のようにするとエラーが出ました。
エラーは下の長いやつのような感じです。
こちらを参考にして原因がわかりました。
ありがとうございました。

stackoverflow.com

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'