ほわいとぼーど

ぷろぐらまのメモ帳

Elasticsearchのhead plugin

Rebuild.fmで聞いたlogstash形式が素晴らしいから頑張ってmappingをtemplatesにしたけど
実はまだlogstash形式で動かしてみてない、っていう残念な記事が昨日でしたが、
本日早速試してみました。

logstash形式にはしたばっかりでまだデータ溜まってないので、
自力でlogstash形式になるようにログの日付と同じindexを作って入れて
Kibana3でlogstash形式で見てみましたが普通に動きました。
日付も@timestampではなくログから入れたrequest_time指定で問題なく。

※このrequest_timeとかいう名前付けが紛らわしいかもしれないことを
 今更ながら気づきましたが今の所は勘弁してやってください。
 Apache2ログにおける日付の部分を抽出したもののことです。
 きっとFluentd設定を説明する回があったらこの話もするはず。。。しました。


コレで終わるとあんまりなのでhead pluginの話をします。
例によってインストール系の話は後でする予定なので飛ばします。

9月1日から6日までのログをlogstash形式で入れてみた状態を
head pluginで開いたのが以下になります。

f:id:a3no:20130912234510j:plain
横(列)に並んでるのがindex、縦(行)がノードです。
ノード名は起動するごとに適当に人名らしきのがランダムでつきます。
現在はDracula(ドラキュラ)らしい。
0~4の箱はシャードをあらわしています。
デフォルトのままなので各indexにシャード5個とreplicas1個なのですが、
ノード1個しかないのでreplica側はUnassignedになってますね。

シャードはノードが複数の場合は指定して移動させたりもできるようです。
その辺は@PENGUINANA_さんのスライドに書いてた。
http://www.slideshare.net/slideshow/embed_code/25714442?startSlide=46
それとシャード分割はindex構築時にしか指定できないのでご利用は計画的に、
って大谷さんのスライドに書いてた。(32ページ)
http://blog.johtani.info/images/entries/20130830/IntroductionES20130829.pdf

各indexの名前、情報、簡単な操作もできます。
sizeは容量、docsはレコード数です。
kibana-intというindexはKibana3でダッシュボードの設定を保存した場合にできるもの。


f:id:a3no:20130912234512j:plain
infoボタンからindexの設定等の詳細情報が見れます。
画像はmetadataを開いてmappingを確認しているところ。


f:id:a3no:20130912234514j:plain
Actionsボタンを開いたところ。
DELETEボタンで簡単にindex削除できてしまいます。
他のは試してないので余裕が出来たら試してみたい。

以上はhead pluginのタブ1枚目「Overview」で見れる情報でしたが、
2枚目「Browser」では生データが見れます。

f:id:a3no:20130912234516j:plain

感覚的に使えますね。

タブ3枚目「Structured Query」と4枚目「Any Request」は
Queryを実行して結果をブラウザ上で見れるものです。

こんな感じでElasticsearchの大抵の操作は出来てしまいます。
動確したりするのに捗りますね。

Elasticsearchのlogstash形式indexについて

indexはElasticsearchにおけるスキーマみたいなものなわけですが、
logstash形式(LogStashはjavaのログimport機構?)にした場合、
indexはimportした日毎に作成されます。
例えば今日から5日間Fluentdで取得し続けた場合、
 logstash-2013.09.11
 logstash-2013.09.12
 logstash-2013.09.13
 logstash-2013.09.14
 logstash-2013.09.15
みたいにindexが1日毎に分かれて作成されます。これの利点は
・データ検索する時に日付で範囲指定すると対象データも絞れるので検索が早くなる
・ある程度経過したデータを日付で管理して削除したりできる。つまりログローテート機構
偶然、Rebuild.fmで聞いてスゲーと思いました。
データ管理まで考えられてるなんで至れり尽くせりですね。
前述のmapping templatesはlogstash形式で作られるindexに対して
mappingを自動的に適用できるようにしたかったので調べてみたものです。


当然、Kibanaもこのlogstash形式の利点を生かせるように作られています。
Kibana3でのindexの設定はダッシュボードのタイトルの右の丸っぽいのを
クリックして出てくる画面で設定できます。

f:id:a3no:20130911231051j:plain

デフォルトでlogstash形式が選択されていて連動しそうな感じです。(まだ試してません)
もしかしたら@timestampとしか連動しないかも、とちょっと疑ってます。(まだ試してません)
デフォルトでlogstash形式が選択されていて日付範囲選択と連動します。

過去ログをimportするとかで日付と関係ないケースも考えられますが、
そういう場合などに自分で好きなindex名をつけることも当然可能です。
その場合は、プルダウンでnoneを選んでindex patternの所にindex名を直接入れるか、
あるいは「_all」を設定すると全てのindexを対象にしてくれます。


indexをlogstash形式にするにはFluentdの場合、
「logstash_format true」を設定するだけです。
この場合、index_nameに名前をつけていたとしても無視されます。

読み返してて「まだ試してません」って酷いなと思いましたが、
多分こういうことだから誰か試してね余裕出来たらすぐ試せるはず、、、
(追記)試してみました。

Elasticsearchにmappingをtemplate設定してみた

Elasticsearchはスキーマレスなのでそのままデータ突っ込んでも動きますが、
デフォルトだとStringとして取り込まれるし、無駄に要素解析されます。
効率や検索性を考えて部分的にスキーマを先に設定しておきます。

自分の場合、今回はApacheなログだったので、
・request_time:ログ日付をdate_formatで認識させたい
・req_size, response_time: 数字として認識させたい
・protocol, method, code: 要素解析しない
みたいなmappingを設定をしました。

なお、res_sizeも数字にさせたかったのですが、
method:HEADみたいな時に「-」が入ってきてしまってParseErrorだったので、
とりあえず今はStringで我慢しています。
ということで書いたのは以下。

{
  "template_1" : {
    "template" : "*",
    "mappings" : {
      "apache" : {
        "properties" : {
          "protocol" : { "type":"string", "index":"not_analyzed" },
          "request_time" : { "type":"date", "format":"dd/MMM/YYYY:HH:mm:ss Z" },
          "method" : { "type":"string", "index":"not_analyzed" },
          "code" : { "type":"string", "index":"not_analyzed" },
          "res_size" : { "type":"string" },
          "req_size" : { "type":"integer" },
          "response_time" : { "type":"integer" }
        }
      }
    }
  }
}

"apache"の部分がtypename、"properties"の下の階層が各設定要素、
"template"の値はマッチさせたいindexのパターンだったかな?
設定内容はだいたい見るとわかりますね!

"mapping"以下の部分をガイドのようにcurlで直接設定もできるわけですが、
indexをlogstash形式でよろしくやりたい時に自動的に適用されるようにしたかったので
templatesというのを試してみました。

上のをtemplate_1.jsonとして以下のパスに配置します。

/<elasticsearch_dir>/config/templates/template_1.json

ファイル名と1つ目の要素が一緒でないとダメかどうかは試してません。
配置してelasticsearchを再起動すれば設定が適用されるはずですが、
注意点として、この時点では設定を確認することが出来ません。
例えばcurlでmapping&index作成した場合、当該indexのstatus情報をhead等で見ると
mappingが設定されていることを確認することが出来ます。
しかしtemplateを使った場合は設定されるのはindexが作成される時なので
indexを別途作ってみないと本当に適用がうまくいくかは確認できません。
jsonに不備がある場合はあえなく失敗するのでちゃんと事前に試しましょう。

(追記)パース次第ではログ日付のmappingは不要でした。 →「fluentd-plugin-elasticsearchでのログ時刻の扱い」

Elasticsearch勉強会[8/29(Thu.)]に参加してきました。

http://atnd.org/event/E0018616
http://blog.johtani.info/blog/2013/08/30/hold-first-elasticsearch-meetup-in-japan/

1. 「ElasticSearch入門」シーマーク 大谷さん
http://blog.johtani.info/images/entries/20130830/IntroductionES20130829.pdf

2. 「elasticsearchプラグイン入門 ~ mocksolrpluginでSolrと入れ替えてみよう」エヌツーエスエム 菅谷さん

3. 「Debugging and testing ES systems」エムスリー Chris Birchallさん

4. 「ニコニコ動画データセット 25億件を検索可能にしてみよう」@PENGUINANA_ さん


連日の勉強会という無茶をしましたがこの日は充実。
もともと触ろうとは思ってたけど本当にタイミングでその週からElasticsearchを
触り始めたところでいろんな意味で捗りました。
自分は本当に入門だったので、そういった意味では4→3→1→2だと良かったのかも。
最後のPENGUINANA_さんのところで色々つながって「おぉっ」となりました。
Solrじゃない勢としてはやっぱりKibanaが来るとイメージしやすいですよね。
それでいてスケールもして全文検索もしてとオールマイティ感あふれます。
この回だけでもかなりおなか一杯になりました。
資料を眺めるだけでもかなり捗るんじゃないでしょうか。

ということで自分でも記事を書く予定なのですが・・・