おいちゃんと呼ばれています

ウェブ技術や日々考えたことなどを綴っていきます

ステップバイステップで学ぶ Fluentd + GrowthForecast でグラフ作成まとめ

最近ペパボ社内でもっとうまくログ解析をして、ビジネスサイクルをもっとうまく回していこうぜという機運が高まっています。

当然 Fluentd とかにも話題が及ぶのですが、やっぱり自分で使ってみないと感覚が掴めないよねと、ようやく重い腰を上げて Fluentd に触ってみたのが 2013年に入ってから。そのときに下記の記事に大変助けられました。

-fluent-agent-lite と td-agent で、小さくはじめる fluentd - studio3104::Blog

他で td-agent の設定ファイルの見本とかをみても全然意味が分からなかったのですが、上記記事の、少しずつできる範囲を拡げていくやり方で、やっと Fluentd と仲良くできそうな気がするところまで辿り着きました。

で、今回は、上記記事のステップバイステップ方式を踏襲しつつ、内容を少し進めて、Fluentd と GrowthForecast を組み合わせて、サイトのレスポンスタイムをグラフで表示させてパフォーマンス監視をしようという試みです。だいたいこのくらいまでできるようになると、あとは大体自由にいじれるようになるんじゃないかなと思います。

**ステップバイステップで学ぶ Fluentd + GrowthForecast でグラフ作成まとめ +完成図 +前提 +前提の段階の設定ファイル +前提の補足 +GrowthForecast のインストール +パフォーマンス監視に不要なログを除外する +URL をグループ化する +レスポンスタイムの単位を変換する +平均、最小、最大、パーセンタイル値を算出する +GrowthForecast へ送信してグラフを表示 +完成時の td-agent.conf +次のステップ <<

*1. 完成図

下記のような感じのグラフを表示させることが今回のゴールです。

サーバ構成は下記のような感じ。

1, 2, 3 は同一サーバでも良いです。あるいは 1 のログ送信サーバ(Web サーバ)は、業務でやっているときは複数台あることが多いと思いますので、そのあたりは適宜読み替えてください。

*2. 前提

最初にも触れましたが、今回の内容は、下記の記事に書かれている基本的なことは済ませている前提です。

-fluent-agent-lite と td-agent で、小さくはじめる fluentd - studio3104::Blog

つまり、次の項目については、上の記事に分かりやすく書かれているので、分からない人はそちらを参考にしてください。

-fluentd と td-agent の違い -ログ送信サーバ(Web サーバ)には td-agent ではなく、fluent-agent-lite を入れるメリット -fluent-agent-lite のインストール -td-agent のインストール -fluentd のプラグインのインストール -fluent-agent-lite を使って、Web サーバからログ集約サーバへ生ログを送る -td-agent を使って、送られてきた生ログを保存する -td-agent を使って、送られてきたログをパースする -Apacheaccess_log のフォーマットは一般的な combined の末尾にレスポンスタイムを足した形式

|conf| LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" combined ||<

*3. 前提の段階の設定ファイル

上記の記事を参考に手を動かしたら、だいたい下記のようになると思います(若干好みの関係で変えているところはあります)。今回はここからスタートします。

|conf|

/etc/fluent-agent-lite.conf

TAG_PREFIX="" LOGS=$(cat <<"EOF" apache.access /var/log/httpd/access_log apache.error /var/log/httpd/error_log EOF ) PRIMARY_SERVER="xxx.xxx.xxx.xxx(ログ集約サーバの IP アドレス):24224" ||<

|conf|

/etc/td-agent.conf

type forward

type copy

type file_alternative path /var/log/td-agent/httpd-access time_slice_format %Y%m%d output_include_time false output_include_tag false output_data_type attr:message add_newline true

type parser add_prefix parsed format /^(?[^ ]) [^ ] (?[^ ]) [(?)] "(?\S+)(?: +(?[^ ]) +\S)?" (?[^ ]) (?[^ ])(?: "(?[^\"])" "(?[^\"])" (?<response_time>[^ ]*))?$/ time_format %d/%b/%Y:%H:%M:%S %z key_name message

type file path /var/log/td-agent/parserd-httpd-access

type file_alternative path /var/log/td-agent/httpd-error time_slice_format %Y%m%d output_include_time false output_include_tag false output_data_type attr:message add_newline true ||<

なお、パースされたログは下記のようになります。

|| 2013-02-16T15:05:00+09:00 parsed.apache.access {"host":"xxx.xxx.xxx.xxx","user":"-","method":"GET","path":"/videos?page=16","status":"200","size":"47197","referer":"http://babyshark.info/videos?page=15","agent":"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17","response_time":"181012"} ||<

*4. 前提の補足

前提として取り上げた記事について 4点ほど補足しておきます。

**(1) fluent-agent-lite のインストール

fluent-agent-lite のインストール(rpm はつくらずに、install.sh を使いました)のときにエラーになってしまい、perl-devel をインストールして再実行するとうまくいきました。

-[http://d.hatena.ne.jp/inouetakuya/20130212/1360669490:title=「make: *** Makefile' に必要なターゲット/usr/lib64/perl5/CORE/config.h' を make するルールがありません. 中止.」エラーが出た場合の対処方法:bookmark]

**(2) out_file と fluent-plugin-file-alternative の違い

out_file は Fluentd 標準のファイル出力プラグインで「type file」とか書いて使うものです。一方、fluent-plugin-file-alternative は out_file よりもちょっと高機能な感じのプラグインです。

-fluentdのout fileプラグインの仕様について - blog.tnmt.info -#fluentd fluent-plugin-file-alternative released! - tagomorisのメモ置き場

今回のエントリーの内容では、さほど特別なことをやっていないので、どちらを使っても大差ないのですが、送信されてきた生ログをそのまま保存するとかは、fluent-plugin-file-alternative のほうを使う必要があります。

**(3) ログファイルの保存先について

/tmp ディレクトリ配下は設定によってはサーバ再起動等のタイミングで削除されたりするので、それを避けるのであれば /var/log 配下に保存するのがよいのではないかと思います。ただし、ログファイル保存時に書込権限が必要なので注意。

**(4) match、copy、store の使い方について

match はともかく、copy と store は一見分かりにくいかもしれないので。

-match は、マッチしたログに対して処理を行うもの -copy と store は、match の中で複数の処理を行いたいときに使うもの

*5. GrowthForecast のインストール

というわけで、ここから先、グラフ表示に向けてどんどん手を進めていきたいところですが、先に WebAPI 経由でいろんな値を送り込んでグラフ化できる GrowthForecast のインストールをしておきます。手順は先日書きましたので下記を参考にしてください。

-GrowthForecast を CentOS 6.3 にインストールして Supervisor で管理してみた

とりあえず必要最小限のことだけやって先に進みたい人は、Supervisor からのくだりはすっ飛ばしてよいと思います。

*6. パフォーマンス監視に不要なログを除外する

今回はパフォーマンス監視をして、参照されるページのレスポンス改善をしたいので、目的に沿わないログは除外します。

-画像等の静的ファイルへのアクセス -リクエストメソッドが GET 以外のアクセス -ステータスコードが 200 以外のログ

不要なログを除外するためには、fluent-plugin-rewrite を使います。同プラグインをインストールしてください。

-fluent-plugin-rewriteというプラグインを作成した #fluentd - delirious thoughts

除外する設定は下記です。前提の段階の設定ファイル中の「」タグの中身は、ログファイルを保存するだけでしたが、そこを書き替えてください。

|conf|

/etc/td-agent.conf(抜粋)

type copy

type file path /var/log/td-agent/parserd-httpd-access

type rewrite remove_prefix parsed add_prefix filtered key path pattern ^\/(?:assets|thumbnails|favicon) ignore true key status pattern ^(?!200)\d+$ ignore true key method pattern ^(?!GET).+$ ignore true

type file path /var/log/td-agent/filterd-httpd-accsess ||<

正規表現が苦手な人もがんばって。filterd-httpd-accsess には下記のような感じで保存されていきます。もちろん本番環境では全ての段階でのログを保存する必要はないのですが、td-agent.conf の編集時には、意図した情報をきちんと取得できているかを適宜確認すると手戻りが少なくて良いと思います。

|| 2013-02-16T15:06:14+09:00 filtered.apache.access {"host":"xxx.xxx.xxx.xxx","user":"-","method":"GET","path":"/videos?page=2","status":"200","size":"46672","referer":"http://babyshark.info/","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17","response_time":"218755"} ||<

*7. URL をグループ化する

サイトのレスポンス改善にあたって、同種類のページはまとまっていた方がグラフが見やすくなり、分析もしやすいのでグループ化します。

僕が運用しているエロサイト「babyshark」を例にとると、トップページと動画ページとタグページをグループ化して、残りを others で括りました。どんなページなのかは、後ろに誰もいないことを確認してからこっそり見てください(宣伝)

-babyshark - 日本人AV女優の動画を XVIDEOS などから厳選して配信(スマートフォン対応)

例によって「」タグの中身を書き替えます。

|conf|

/etc/td-agent.conf(抜粋)

type copy

type file path /var/log/td-agent/filterd-httpd-access

type rewrite remove_prefix filterd add_prefix grouped key path pattern ^\/$ replace /top key path pattern ^\/(top|videos|tags) append_to_tag true fallback others

type file path /var/log/td-agent/grouped-httpd-access ||<

append_to_tag true によって、末尾にタグ付けされ、

-grouped.apache.access.top -grouped.apache.access.videos -grouped.apache.access.tags

が作成されます。また条件から漏れたものが

-grouped.apache.access.others

になります。

|| 2013-02-16T15:08:59+09:00 grouped.apache.access.tags {"host":"xxx.xxx.xxx.xxx","user":"-","method":"GET","path":"/tags/127?page=3","status":"200","size":"46912","referer":"http://babyshark.info/tags/127?page=2","agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17","response_time":"180892"} ||<

*8. レスポンスタイムの単位を変換する

レスポンスタイムがマイクロ秒で出力されているのですが、ミリ秒の方が頭に入って来やすいと思うので変換します。fluent-plugin-forest というプラグインを使います。

-fluent-plugin-forest released! - tagomorisのメモ置き場

|conf|

/etc/td-agent.conf(抜粋)

type copy

type file path /var/log/td-agent/grouped-httpd-access

type foreset subtype amplifier_filter remove_prefix grouped

type file path /var/log/td-agent/amplified-httpd-access ||<

|| 2013-02-16T15:10:01+09:00 amplified.apache.access.top {"host":"xxx.xxx.xxx.xxx","user":"-","method":"GET","path":"/top","status":"200","size":"45113","referer":"-","agent":"Wget/1.12 (linux-gnu)","response_time":252.639} ||<

*9. 平均、最小、最大、パーセンタイル値を算出する

より効果的なパフォーマンス監視のため、平均、最小、最大、パーセンタイル値を算出します。fluent-plugin-numeric-monitor というプラグインを使います。

-fluent-plugin-numeric-monitor v0.1.0 and fluent-plugin-numeric-counter v0.1.0 released! - tagomorisのメモ置き場

|conf|

/etc/td-agent.conf(抜粋)

type copy

type file path /var/log/td-agent/amplified-httpd-access

type forest subtype numeric_monitor remove_prefix amplified.apache.access

type file path /var/log/td-agent/httpd-response-time ||<

|| 2013-02-16T15:10:21+09:00 apache.response_time.top {"num":1,"min":152.906,"max":152.906,"avg":152,"percentile_90":152.906,"percentile_95":152.906} ||<

*10. GrowthForecast へ送信してグラフを表示

やっとここまで来ました。最後はデータを GrowthForecast へ送信して、グラフを表示させます。fluent-plugin-growthforecast というプラグインを使います。

-fluent-plugin-flowcounter および fluent-plugin-growthforecast released! #fluentd - tagomorisのメモ置き場

|conf|

/etc/td-agent.conf(抜粋)

type copy

type file path /var/log/td-agent/httpd-response-time

type growthforecast gfapi_url http://(GrowthForecast の IP アドレス):5125/api/ service myservice tag_for section name_keys avg,max,min,percentile_90,percentile_95 ||<

下記のようなグラフが表示されたら完成です。

*11. 完成時の td-agent.conf

完成時の td-agent.conf は下記です。

-sample of td-agent config file

*12. 次のステップ

今回の内容でとりあえずパフォーマンス監視できるようになりましたが、これからさらに発展させるために下記のようなことにチェレンジしてみると良いかもしれません。

-ステータスコード毎の割合のグラフをつくる -レスポンスタイム毎の割合のグラフをつくる -イイ感じの複合グラフをつくる -全ログデータを処理せずに適当にサンプリングしたデータのみ処理して、td-agent の負荷を減らす

詳細は下記を参考にしてください。

-fluentdでWebサイト運用を楽にする -fluent-plugin-numeric-monitor v0.1.0 and fluent-plugin-numeric-counter v0.1.0 released! - tagomorisのメモ置き場 -fluent-plugin-sampling-filter and fluent-plugin-datacounter released! #fluentd - tagomorisのメモ置き場 -GrowthForecastでAPI使って複合グラフ作ったり、グラフの色を変えたりしてみた - IT 東京 楽しいと思うこと

以上です。おつかれさまでした!

*参考サイト

-fluentd を利用した大規模ウェブサービスのロギング