Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

Fluentd+Elasticsearch+Kibana構成で便利な、logstash形式インデックスの粒度をカスタマイズする方法

f:id:yoshi-ken:20140106222931p:plain

fluent-plugin-elasticsearchやKibanaのデフォルトであるlogstash形式では、年月日毎にインデックスを作成されて使われることを想定されています。 これは扱いやすいのですが万能では無く、次のような状況ではパフォーマンス的な観点で、このインデックスの粒度を変更することを検討すると良いケースがあります。

  • 粒度を細かくしたいケース(時間単位)

    • 日毎のインデックス作成では、elasticsearchに割り当てたメモリ量を超えてしまう
  • 粒度を荒くしたいケース(週単位/月単位/年単位)

    • 日毎のインデックス作成では容量が小さく、日常的に検索する範囲が複数のインデックスに渡るとき

Kibanaは年月日以外の粒度(時間・日・週・月・年)にも対応していますので、変更することも容易です。これは次の2つの設定変更で適用できます。

  • ログ収集を行うElasticsearchへ流し込む、Fluentdの設定
  • 検索側フロントエンド、Kibanaの設定(DashboardSettings->Index)

それでは早速、それぞれの設定の紹介をします。

60分単位で作る

60分単位で作るので、1日に24インデックス作られます。

Fluentd
logstash_prefix      logstash
logstash_dateformat  %Y.%m.%d-%H
Kibana
[logstash-]YYYY.MM.DD-HH
作成されるインデックス名
  • 2014年1月1日 1時 => logstash-2014.01.01-01
  • 2014年1月1日 2時 => logstash-2014.01.01-02

日単位で作る

1日1インデックスなので、1ヶ月で28〜31のインデックスが作られます。

Fluentd
logstash_prefix      logstash
logstash_dateformat  %Y.%m.%d
Kibana
[logstash-]YYYY.MM.DD
作成されるインデックス名
  • 2014年1月1日 => logstash-2014.01.01
  • 2014年1月2日 => logstash-2014.01.02

週単位で作る

1週1インデックスなので、1年で52〜54のインデックスが作られます。
2014-01とすると月と間際らしいため、Weekの先頭の文字を取り、2週目であればW2とするサンプルを紹介します。

Fluentd
logstash_prefix      logstash
logstash_dateformat  %Y.W%V
Kibana
[logstash-]YYYY.[W]WW
作成されるインデックス名

週は月曜日始まりの日曜日終わりでカウントします。

  • 2014年1月5日 => logstash-2014.W01
  • 2014年1月12日 => logstash-2014.W02

月単位で作る

1月1インデックスなので、1年で12のインデックスが作られます。

Fluentd
logstash_prefix      logstash
logstash_dateformat  %Y.%m
Kibana
[logstash-]YYYY.MM
作成されるインデックス名
  • 2014年1月 => logstash-2014.01
  • 2014年2月 => logstash-2014.02

確認方法

Fluentdから流し込むときはRubyのstrftimeに合わせて、KibanaではMoment.jsに合わせた記法とする必要があります。
そのため、それぞれで同じ結果となるように設定する必要があるのが要注意ポイントですね。

moment.js

moment.jsのテストを行いたい場合には、momentjsのページを開いて、GoogleChromeJavaScriptコンソールを開いて次のように打ち込み、Enterを押せば結果がその場で分かります。

> moment("2014-01-06").format('[logstash-]YYYY.[W]WW');

formatで使える文字列はmoment.js/formatのドキュメントが参考になります。

Ruby

Rubyであれば、次のようにirbで確認します。

$ irb
> require 'date'
> require 'time'
> Time.parse("2014-01-06").strftime("%Y.W%V")
 => "2013.W07"

strftimeで使える文字列はRuby/Time/strftimeのドキュメントが参考になります。

まとめ

今回はfluent-plugin-elasticsearchとkibanaのインデックス粒度の調整方法を紹介しました。
なお、際限なくインデックスが増えないよう、インデックスの削除計画も一緒に建てられると良いですね!