Solr のクエリログを fluentd と kibana で可視化
かなり遅ればせながらですが、ELK*1を試してみました。
Solr は検索機能としては、十分すぎるほどの機能があるのですが、運用系のUIがプロプライエタリな検索エンジンに比べて弱い部分があります。例えば、クエリログの分析画面がそれだったりしますが、そこで、ログを kibana に食わせて簡易画面を実現できないかと思いたち、作ってみました。
(SolrのクエリログをElasticsearchに食わせるなんて、なかなかシュール・・w 結構されている例かと思ったけど、意外となかった。)
環境
以下を全て1台に導入しました。
- Apache Solr 4.9.0
- Elasticsearch 1.3.2
- kibana 3.1.0
- td-agent 1.1.20-0
必要なプラグイン
- fluent-plugin-fields-parser
- fluent-plugin-elasticsearch
Solr のログ
Solr のログは、example が出力する solr.log を対象にしました。jetty で取ることのできる Request Log を apache でパースすることも考えたのですが、hits や QTime が取れません。今回は、クエリの頻度や0ヒットの分析を目的としたいので、solr.log を対象にします。以下、サンプルです。
INFO - 2014-09-29 09:27:43.060; org.apache.solr.core.SolrCore; [collection1] webapp=/solr path=/select params={facet=true&indent=true&q=genre:hogefoobarabcabc&_=1411982871311&facet.field=genre4nav&wt=json} hits=0 status=0 QTime=1
td-agent.conf
以下の設定で、solr のクエリログの下記の項目が新規のフィールドとして記録されます。
- loglevel
- time
- class
- core
- webapp (solr固定)
- path (/select など)
- params
- q、fq、wt、indent、facet、facet.field などなど
- 使われたものだけが適宜記録
- hits
- status
- QTime
<source> type tail path /opt/solr/solr-4.9.0/example/logs/solr.log pos_file /var/log/td-agent/solr.log.pos tag raw.solr.log format /^(?<loglevel>[^ ]*) (?<hyp>[^ ]*) (?<time>[^ ]* [^ ]*) (?<class>[^ ]*) \[(?<core>[^ ]*)\] webapp=\/(?<webapp>[^ ]*) path=\/(?<path>[^ ]*) params={(?<params>[^ ]*)} hits=(?<hits>[^ ]*) status=(?<status>[^ ]*) QTime=(?<Qtime>[^ ]*) / time_format %Y-%m-%d %H:%M:%S.%L; </source> <match raw.solr.log> type fields_parser remove_tag_prefix raw # add_tag_prefix debug parse_key params # fields_key params pattern ([\w|\.]+)=([^ &]*) </match> <match solr.log> type elasticsearch type_name solr_log host localhost port 9200 logstash_format true include_tag_key true tag_key @log_name </match>
正規表現のつくりかた
tail の format に記載する正規表現は作成するのに時間がかかりました。自分なりの作成のコツを書いておきます。
apache 用の設定とapacheのログファイルのサンプルと、自分のパースしたいログを見比べつつちょっとずつ修正します。以下のツールを使うと、ちょっとずつ直すことができます。
Ruby の正規表現チェッカー Rubular で、正規表現の動作を確認します。fluentd 用のツール Fluentular は、tail の設定も表示されて便利なのですが、前後のスペースがトリムされるなど、ちょっと動きがよくわからないことがありました。Rubular の場合、どこにマッチしているかがハイライトされるので、ちょっとずつ直すのに便利です。
Solr の params の展開について
Solr の params の部分の展開に苦労しました。params の展開は、Solr tail の regx だけでは出来ません。各項目が、& でつながっていて、順番が変わったり、項目がない場合があるケースがあるというのがハードルでした。
以下、params のみ抜き出しました。
params={facet=true&indent=true&q=genre:hogefoobarabcabc&_=1411982871311&facet.field=genre4nav&wt=json}
最終的には fledls_parser というプラグインを使って解決しました。これを使うと、params のような key/value 型の値を、フィールドと値に分解することができます。
https://github.com/tomas-zemres/fluent-plugin-fields-parser
fluentd の売りとして多数のプラグインとあり、実際かなり便利なのですが、自分が必要なプラグインを探すのがなかなか大変でした。。多分 ruby と gem を覚えて、プラグインを自分で書けるようになるといいなと思いました。コードを見る限りシンプルなので、ハードルは低そうです。
サーバ/インフラエンジニア養成読本 ログ収集~可視化編 [現場主導のデータ分析環境を構築!] (Software Design plus)
- 作者: 鈴木健太,吉田健太郎,大谷純,道井俊介
- 出版社/メーカー: 技術評論社
- 発売日: 2014/08/08
- メディア: 大型本
- この商品を含むブログを見る
*1:Elasticsearch+Logstash+Kibanaの組み合わせのことで、ログの可視化ソリューションを実現するソフトウェアスタックのこと。まあ、日本では Logstash の代わりに fluentd が使われることが多いようです。