@johtaniの日記 2nd

@johtani ‘s blog 2nd edition

Fluent-plugin-zoomdata作りました+悩み事とか

憧れ?のfluentを使ってみました。 こちらの記事で紹介したZoomdataを最近触っているのですが、お試しにfluentdでデータ流し込むプラグインを作ってみようかなぁと。(今は、Javaでの接続も書いていて、主にそっちを使っています。) ということで、作ってみました。fluent-plugin-zoomdata

基本的にはtagomoris先生のfluent-plugin-growthforecastを参考(パクリ?)にさせてもらいました。 作っている最中もここわからんってツイートに反応していただき、大変助かりました。 私はベースがJavaの人間なので、手探り状態でRubyを書いています。そこおかしいんじゃないの?とかあればコメントもらえると嬉しいです。

ZoomdataのAPI

ZoomdataのAPIはこんなかんじで、JSONをHTTPSでPOSTするものになります。

指定する必要があるものは、以下の項目です。

  • source:Zoomdataのデータ保存先(Zoomdataでのデータを保存する単位。)
  • user:Zoomdataのユーザ名
  • password:Zoomdataのユーザのパスワード
  • JSONデータ:Zoomdataでグラフ化するデータ

sourceはデータ保存先の名称で、この単位でZoomdataはデータを保存、描画します。fluentdのタグをこれにするとわかりやすいかなぁ?と考えていったん、実装してみています。

で、作成したプログラムを使いつつ、Zoomdataの検証をしたかったので、つぎのような簡単なプログラムを作って動かしてみました。

サンプルプログラムの構成

基本的にJavaの人なので、クライアントはJavaで書いてます。 CLIプログラムで適当なJSONを作って、fluent-loggerを使って、fluentdに投げ込みます。

fluentdにfluent-plugin-zoomdataを設定して、localのZoomdataサーバに対してHTTPSでJSONをPostする仕組みです。(初keynote)
利用しているライブラリなどのバージョンは次の通り

  • td-agent.x86_64:1.1.12-0
  • fluent-logger:0.2.8
  • Zoomdata:1.0.3

バグ?

で、Zoomdataにいろんなデータを流し込んでみたのですが、つぎのようなエラーが出て、エラーが出力されたあとはZoomdataにデータが流れ込まなくなってしまいました。

1
2
3
4
2013-06-03 14:42:33 +0900 [warn]: emit transaction failed  error="SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure"
  2013-06-03 14:42:33 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/net/http.rb:799:in `connect'
  2013-06-03 14:42:33 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/net/http.rb:799:in `block in connect'
  2013-06-03 14:42:33 +0900 [warn]: /usr/lib64/fluent/ruby/lib/ruby/1.9.1/timeout.rb:54:in `timeout'

全ログはこちら

まだきちんと問題を調査しないでブログを書いています、すみません。

現象

ログが発生した時の症状です。

  • クライアントプログラムは送信が続いており、エラーは出ない
  • td-agent.logに先ほどのエラーが出力
  • 別途type fileにて出力しているログも停止

想像

とりあえず、ログを見た想像、所感です。

  • 問題の箇所はfluent-plugin-zoomdataからZoomdataサーバへのデータ送信部分
  • emit処理内部で、HTTPSでデータをPOSTする処理でエラーが起きて
  • リトライ処理とか書いてないので、emitがコケて、その後データが送信されなくなる
  • emitで例外をつかみそこねてるのがあるから止まってる?

とまぁ、ちゃんと仕組みを理解しないでRubyとか書くからこうなるんですねぇ。 あとでちゃんと調べて考えて、改良してブログ書きます。

悩んでいる点、今後手を入れたい点

上記バグとは別に作りの点でいくつか悩んでる点も書いてみます。

BufferedOutputにしてみたい

fluentdのバッファリングを使って、Zoomdataが落ちていても使えるようにしたいと思っているのでBufferedOutputで書くのがいいのかなぁとか。 ちょうどいいスライドがあったので、読みながらまずは中身を理解してみよう。

Zoomdataのsource、userなどの扱い

基本的には設定ファイルで切り替えるのが妥当かなぁと思っています。
ただ、Zoomdataのsourceやuserが増えるたびにfluentdの設定を書き換えて再起動するのかなぁと。userはしょうが無いにしても、sourceは設定じゃない所で切り替えたいなぁと。

で、切り替えるのにつぎの案があるかなぁと。

  1. タグで指定(今実装してるもの)
  2. メッセージにメタ情報とボディ構造を設ける
  3. 設定をどんどん増やす(やりたくない)

1と3はまぁ、いいかと。2.のパターンはどうなのかなぁと。 毎回のメッセージでヘッダ部分が送信されるのはなんだか無駄だなぁというのが否めないので悩ましいところです。1、2の両方対応できるように作るのもありか。

1
2
3
4
5
6
7
8
9
10
11
{
  "header": {
      "source": "source_name",
      "user": "userid",
      "password": "userid",
  },
  "body": {
      "label": "label1",
      "count": 1
  }
}

ということで、fluent触って遊ぶの楽しいですね。Rubyの勉強にもなりそうだし。 ちょっとずつ頑張ってみようかなぁと。 まぁ、まだ私以外にニーズは無さそうなプラグインですが。

Comments