2013年1月15日火曜日

Fluentdってなんじゃ?(datacounter+Growthforecast+RDSでステータスコードの傾向を可視化)


Fluentdではさまざまなデータを構造化することができるので、フロント側の可視化ツールに渡すことも柔軟に対応できます。今回はGrowthForecastという可視化ツールに表示させてみます。

データはApacheのログを使い、表示する内容はHTTPステータスコードの2xx,3xx,4xx,5xxのそれぞれの回数を時系列で表示してみたいと思います。またGrouthForecastはデータのスタックにDBを使用し、デフォルトではsqlite3ですが、今回はRDSのMySQLを利用してみます。

構成は下図のようなイメージです。



管理サーバー(222.222.222.222)


まずは、管理サーバーのEC2インスタンスにGrowthForecastをインストールします。

必須ライブラリをインストールします。

# yum groupinstall "Development Tools"
# yum install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel cpan mysql-devel bitmap-console-fonts

perlbrewcpanmをインストールします。

# cpan YAML JSON::XS
# curl -kL http://install.perlbrew.pl | bash
# cpan App::perlbrew perlbrew init
# perlbrew install perl-5.16.0
# perlbrew switch perl-5.16.0

# cd /usr/bin
# curl -LO http://xrl.us/cpanm
# chmod +x cpanm
# cpanm --self-upgrade

GrowthForecastをインストールします。

# cpanm -n http://nomadscafe.jp/pub/GrowthForecast/GrowthForecast-0.34.tar.gz

次に、RDSを設定します。
今回は内容はほぼデフォルトでOKです。



設定したら接続権限を設定します。
RDSのエンドポイントに対して接続し、GRANT文を定義します。

# mysql -u memorycraft growthforecast -pmemorycraft-pass -h growthforecast.cwnvl1ncuiwq.ap-northeast-1.rds.amazonaws.com
mysql>GRANT CREATE, ALTER, DELETE, INSERT, UPDATE, SELECT ON growthforecast.* TO 'memorycraft'@'222.222.222.222' IDENTIFIED BY 'memorycraft-pass';

また、RDSのセキュリティグループも設定します。


また、管理サーバーのEC2の5125(GrowthForecastのデフォルトポート)のInboundに管理者とWEBサーバーから接続できるように追加しておきます。




GrowthForacastを起動します。
--with-mysqlオプションをつけると、データベースにMySQLを使用するようになるので、RDSのエンドポイント付きのdsnを渡します。

MYSQL_USER=memorycraft MYSQL_PASSWORD=memorycraft-pass growthforecast.pl --with-mysql dbi:mysql:growthforecast:growthforecast.cwnvl1ncuiwq.ap-northeast-1.rds.amazonaws.com

これで起動されました。
http://222.222.222.222:5125/を見ると以下のように、まだグラフがなにも表示されていません。





WEBサーバー(111.111.111.111)


GrowthForecastはAPI経由でデータを登録するのが基本です。
そしてfluentdには、GrowthForecastにAPI登録する、fluent-plugin-growthforecastというアウトプットフィルタがあるので、
今回はそれを利用します。
また、ログ中のHTTPステータスコードをカウントするために、fluent-plugin-datacounterも利用します。

fluentd(td-agent)のインストールは以前の記事の通りです。

/usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-growthforecast
/usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-datacounter

td-agent.confは以下のように設定します。
tail: Apacheのログを正規表現で構造化
datacounter: statusを2xx,3xx,4xx,5xxに分類して其々をカウント
growthforecast: datacounterの結果をGrowthForecastへ投稿

この場合は、
http://222.222.222.222:5125/api/admintool/httpstatus/グラフ名

への投稿になり、グラフ名には
apache.httpstatus_apache_2xx_count

のように入ります。
これは
growthforecastのタグ_オリジナルタグ_パターン名_count

の形で、datacounterとgrowthforecastの2つのディレクティブを通過しているためのようです。この名前が冗長であれば、それぞれのディレクティブでremove_prefixなどを使って調整など行えそうです。

<source>
  type tail
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/httpd/access_log
  tag apache
  pos_file /tmp/access.log.pos
</source>

<match apache>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type datacounter
    tag apache.httpstatus
    aggregate tag
    count_key status
    pattern1 2xx ^2\d\d$
    pattern2 3xx ^3\d\d$
    pattern3 4xx ^4\d\d$
    pattern4 5xx ^5\d\d$
  </store>
</match>

<match apache.httpstatus>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type growthforecast
    gfapi_url http://222.222.222.222:5125/api/
    service admintool
    section httpstatus
    name_keys apache_2xx_count,apache_3xx_count,apache_4xx_count,apache_5xx_count
  </store>
</match>
ここまで出来たら、td-agentを起動します。

/etc/init.d/td-agent start

これで設定は完了です。
WEBサーバーのコンテンツに適当にアクセスしてから、管理サーバーのGrowthForecastのアドレス(http://222.222.222.222:5125)を見てみます。




項目が出来ています。このリンクを辿って行くと、、



おお、4つのグラフが表示されています。

ここで、「複合フラグの追加」というリンクをクリックすると4つの項目を1つのグラフに統合した新しいグラフを作ることができます。基本のグラフに加え、2番目以降の系列に残りの項目を追加していくと、以下の様にスタックされたグラグを作成することができます。




datacounterという汎用的すぎるプラグインと、GrowthForecastというとても便利なグラフ化ツールで、いろいろなリソースを可視化してみると、運用の負荷軽減だけではなく、ユーザーの動向などもわかってお得ですね。
以上です。