読者です 読者をやめる 読者になる 読者になる

よしだのブログ

サブタイトルはありません。

Solr のクエリログを fluentd と kibana で可視化

IT、プログラミング Elasticsearch Solr 検索エンジン

f:id:yoshi0309:20140930151302j:plain

かなり遅ればせながらですが、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 の場合、どこにマッチしているかがハイライトされるので、ちょっとずつ直すのに便利です。

    http://www.rubular.com/

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)

サーバ/インフラエンジニア養成読本 ログ収集~可視化編 [現場主導のデータ分析環境を構築!] (Software Design plus)

*1:Elasticsearch+Logstash+Kibanaの組み合わせのことで、ログの可視化ソリューションを実現するソフトウェアスタックのこと。まあ、日本では Logstash の代わりに fluentd が使われることが多いようです。