ほわいとぼーど

ぷろぐらまのメモ帳

fluent-plugin-multimapぽいのを書いた話

fluentd-plugin-dstat_stdinぽいのを書いた話に引き続きfluentdオレオレplugin第2弾
fluent-plugin-mapのmultiにフォーカスしたconfigurationを提供するfluent-plugin-multimapを書きました。

何を解決したかったか

dstatをkibanaで可視化+3.0.0milestone5新機能でも説明しているのですが、
Kianaでの可視化のためにfluentd-plugin-mapを使って、1レコードを複数レコードに分割します。
具体的には、

timestamp hostname:host a:1 b:2 c:3
↓
timestamp hostname:host stat:a value:1
timestamp hostname:host stat:b value:2
timestamp hostname:host stat:c value:3

という変換を行います。
そのための設定は例えば以下のようになります。

<match dstat.*>
  type copy
  <store>
    type map
    tag  "map.dstat.a"
    time time
    record {"value" => record["a"], "stat" => "a", "hostname" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.b"
    time time
    record {"value" => record["b"], "stat" => "b", "hostname" => record["hostname"]}
  </store>
  <store>
    type map
    tag  "map.dstat.c"
    time time
    record {"value" => record["c"], "stat" => "c", "hostname" => record["hostname"]}
  </store>
</match>

上記はパラメータが3つだから良いものの実際には縦に長くなって大変です。

もしくは、次のような記述も可能です。

<match dstat.*>
  type map
  map [["map.dstat.a", time, {"value" => record["a"], "stat" => "a", "hostname" => record["hostname"]}], ["map.dstat.b", time, {"value" => record["b"], "stat" => "b", "hostname" => record["hostname"]}], ["map.dstat.c", time, {"value" => record["c"], "stat" => "c", "hostname" => record["hostname"]}]]
  multi true
</match>

縦にはかなり短くなりましたが、代わりに横に長くなってしまいました。
適切な位置で改行がないと見通しが悪くて死んでしまいます。
じゃぁ、どうなれば良いのか

解決策

こんな感じに書きたい。

<match dstat.*>
  type map
  format multimap
  mmap1 ["map.dstat.a", time, {"value" => record["a"], "stat" => "a", "hostname" => record["hostname"]}]
  mmap2 ["map.dstat.b", time, {"value" => record["b"], "stat" => "b", "hostname" => record["hostname"]}]
  mmap3 ["map.dstat.c", time, {"value" => record["c"], "stat" => "c", "hostname" => record["hostname"]}]
</match>

繰り返しがまとめて縦に並ぶので修正もやりやすくなるのではと思います。
1...Nな形式はin_tailのformat multilineからお借りしました。

元記事がkazeburoさんに参照されたこともあって早々にどうにかしたかったのですが、
忙しかったり記事の環境を使わなくなってしまったりとなんだかんだで数ヶ月。

実際には書き方追加以外にも色々やってて、
formatが明示的じゃないとわかりにくいので指定できるようにしたり、
そのための新しい形式名称はどうしようとか、後方互換性はどうしようとかで悩んだり、
multilineは上限20個だったけど自分のdstatは36個くらい出力してたので50くらいにしようだとか、
emitの所が場合分けされてるけどconfigure側で吸収するようにリファクタしたりだとか、
そんな感じで適当に書いてmap本家にpullReq出しました。

しかし色々詰め込みすぎて正直pullReqマージしづらいだろうなという気もしています。
そんなわけで新しいformatにのみ切り出したものを作ってみた。

Kibana4で複数パラメータの同時表示が可能になる予定らしいので、
そうなったら分割する必要は無くなるかもしれません。
ただその場合はmappingをパラメータ種類分書く必要が出るので面倒なんですけどね。
時代は数値変換か?!