彼女からは、おいちゃんと呼ばれています

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

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

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

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

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

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

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

  1. 完成図
  2. 前提
  3. 前提の段階の設定ファイル
  4. 前提の補足
  5. GrowthForecast のインストール
  6. パフォーマンス監視に不要なログを除外する
  7. URL をグループ化する
  8. レスポンスタイムの単位を変換する
  9. 平均、最小、最大、パーセンタイル値を算出する
  10. GrowthForecast へ送信してグラフを表示
  11. 完成時の td-agent.conf
  12. 次のステップ

1. 完成図

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

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

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

2. 前提

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

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

  • 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 の末尾にレスポンスタイムを足した形式
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" combined

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

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

# /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"
# /etc/td-agent.conf
<source>
  type forward
</source>

<match apache.access>
  type copy

  <store>
    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
  </store>

  <store>
    type parser
    add_prefix parsed
    format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response_time>[^ ]*))?$/
    time_format %d/%b/%Y:%H:%M:%S %z
    key_name message
  </store>
</match>

<match parsed.apache.access>
  type file
  path /var/log/td-agent/parserd-httpd-access
<match>

<match apache.error>
  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
</match>

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

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 をインストールして再実行するとうまくいきました。

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

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

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

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

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

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

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

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

5. GrowthForecast のインストール

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

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

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

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

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

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

# /etc/td-agent.conf(抜粋)
<match parsed.apache.access>
  type copy

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

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

<match filterd.apache.access>
  type file
  path /var/log/td-agent/filterd-httpd-accsess
</match>

正規表現が苦手な人もがんばって。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 で括りました。どんなページなのかは、後ろに誰もいないことを確認してからこっそり見てください(宣伝)

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

# /etc/td-agent.conf(抜粋)
<match filtered.apache.access>
  type copy

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

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

<match grouped.apache.access.**>
  type file
  path /var/log/td-agent/grouped-httpd-access
</match>

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

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

になります。

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 というプラグインを使います。

# /etc/td-agent.conf(抜粋)
<match grouped.apache.access.**>
  type copy

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

  <store>
    type foreset
    subtype amplifier_filter
    remove_prefix grouped
    <template>
      add_prefix amplified
      ratio      0.001
      key_names  response_time
    </template>
  </store>
</match>

<match amplified.apache.access.**>
  type file
  path /var/log/td-agent/amplified-httpd-access
</match>
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 というプラグインを使います。

# /etc/td-agent.conf(抜粋)
<match amplified.apache.access.**>
  type copy
  
  <store>
    type file
    path /var/log/td-agent/amplified-httpd-access
  </store>

  <store>
    type forest
    subtype numeric_monitor
    remove_prefix amplified.apache.access
    <template>
      unit minute
      tag  apache.response_time.__TAG__
      aggregate all
      monitor_key response_time
      percentiles 90,95
    </template>
  </store>
</match>

<match apache.response_time.**>
  type file
  path /var/log/td-agent/httpd-response-time
</match>
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 というプラグインを使います。

# /etc/td-agent.conf(抜粋)
<match apache.response_time.**>
  type copy
  
  <store>
    type file
    path /var/log/td-agent/httpd-response-time
  </store>

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

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


11. 完成時の td-agent.conf

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

12. 次のステップ

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

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

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

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