okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

FluentdからElasticsearchに転送してKibanaで可視化する

こんにちは@oko_changです。
前回はFluentdについて記載しましたが、今回はFluentdからElasticsearchにログを転送してKibanaで可視化するまでをまとめておきたいと思います。

環境概要

前回の環境にElasticsearchとKibanaを追加するイメージです。

  • CentOS6.5

f:id:okochang:20140322183510p:plain

Elasticsearchのセットアップ

インストールは公式にあるようにYumリポジトリを追加して簡単に出来ます。
javaが必要なので、それもインストールしておきます。

# rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
# cat >> /etc/yum.repos.d/elasticsearch.repo <<'EOF'
[elasticsearch-1.0]
name=Elasticsearch repository for 1.0.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.0/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
EOF
# yum install elasticsearch java-1.7.0-openjdk

インストールが終わったら起動して、動作確認してみます。

# chkconfig elasticsearch on
# service elasticsearch start
# curl -X GET http://localhost:9200/
{
  "status" : 200,
  "name" : "Knickknack",
  "version" : {
    "number" : "1.0.1",
    "build_hash" : "5c03844e1978e5cc924dab2a423dc63ce881c42b",
    "build_timestamp" : "2014-02-25T15:52:53Z",
    "build_snapshot" : false,
    "lucene_version" : "4.6"
  },
  "tagline" : "You Know, for Search"
}

Kibanaのセットアップ

Kibanaもセットアップは簡単です。
公式ページから圧縮ファイルをダウンロードして、任意のディレクトリに配置します。
KibanaはJavascriptで動作しており、アクセスされるブラウザからElasticsearchがListenしているポートに接続出来る必要があります。
ちょっとその構成が気持ち悪いので、今回はconfig.js内のelasticsearch:の設定を以下のようにし、Apacheのリバースプロキシ経由でアクセスするようにしたいと思います。
Apacheの設定は後述。

# useradd kibana
# passwd kibana
# chmod +x /home/kibana
# su - kibana
$ curl -LO https://download.elasticsearch.org/kibana/kibana/kibana-3.0.0milestone5.tar.gz
$ tar zxvf kibana-3.0.0milestone5.tar.gz 
$ ln -s /home/kibana/kibana-3.0.0milestone5 ./kibana
$ vi /home/kibana/kibana/config.js 
$ grep okochang /home/kibana/kibana/config.js 
    elasticsearch: "http://kibana.okochang.com/es/",
# exit

Apache

Apacheは、以下のように名前ベースのVirtualHostを設定しています。
さらにElasticsearchへの接続用に/es/をリバースプロキシ構成にしています。
必要に応じてDigest認証の設定も追加します。

# yum install httpd
# htdigest -c /etc/httpd/conf/htdigest "Required authentication" okochang
# vi /etc/httpd/conf.d/vhosts.conf
# cat /etc/httpd/conf.d/vhosts.conf 
NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /home/kibana/kibana
    ServerName kibana.okochang.com
    ProxyPass /es/ http://localhost:9200/
    ProxyPassReverse /es/ http://localhost:9200/
    CustomLog logs/access_log custom
    ErrorLog logs/error_log
    Options FollowSymLinks
    <Location />
        AuthType Digest
        AuthName "Required authentication"
        AuthUserFile /etc/httpd/conf/htdigest
        require valid-user
        Satisfy any
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
</VirtualHost>
# httpd -t
# chkconfig httpd on
# service httpd start

ブラウザからKibanaにアクセス

以下のように管理画面のトップページが表示されます。
f:id:okochang:20140320012023p:plain

fluent-plugin-elasticsearch

最後に転送元のサーバでfluent-plugin-elasticsearchをインストールして、Elasticsearchに転送する設定をします。
※以下は前回設定行った設定に追記しております。

# sudo yum install gcc gcc-c++ libcurl-devel
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch --no-ri --no-rdoc
# vi /etc/td-agent/td-agent.conf
# cat /etc/td-agent/td-agent.conf
## Input
<source>
  type tail
  path /var/log/httpd/access_log 
  format /^(?<date>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \w{3}) (?<processing_time>[^ ]*) (?<remote>[^ ]*) (?<user>[^ ]*) \[(?<method>.*)\] (?<status>[^ ]*) (?<size>[^ ]*) \[(?<referer>[^ ]*)\] \[(?<agent>.*)\]/
  pos_file /var/log/td-agent/tmp/apache.access.log.pos
  tag apache.access
</source>

## Output
<match apache.access>
  type copy
  <store>
    type file
    path /var/log/td-agent/apache.access
    time_slice_format %Y%m%d
    time_format %Y%m%dT%H%M%S%z 
  </store>
  <store>
    type forward
    send_timeout 60s
    recover_wait 10s
    heartbeat_interval 1s
    <server>
      name fluentd.okochang.com
      host 10.0.1.200
      port 24224
    </server>
  </store>
  <store>
    type elasticsearch
    host 10.0.1.200
    port 9200
    type_name access_log
    logstash_format true
    logstash_prefix apache_access
    logstash_dateformat %Y%m
    flush_interval 10s
  </store>
</match>

動作確認

管理画面トップのSample Dashboardにアクセスすると、以下のようにWebサーバのアクセスログがたまっていることが分かります。
f:id:okochang:20140320012035p:plain

追記(2014年3月22日)

Elasticsearchのsは小文字が正解です。


ご指摘ありがとうございます、修正しました!

感想

セットアップは思ったよりも簡単ですね。
管理が画面もカッコイイし、色々なログをElasticsearchに保存して可視化したくなります。