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

うまいぼうぶろぐ

linuxとhttpdとperlのメモ

fluent と growthforecast を連携させてさくさくグラフを描く

linux fluent

cacticactiで便利だけど、設定するのに面倒だったりする一方でgrowthforecastはびっくりするぐらい簡単なのでとても素敵ですね。

ログを受け取るfluentd で type datacounter をstoreする設定まで完了している前提。
type datacounter で pattern1 2xx などと設定しておくとfluentの JSON 出力に、2xx_count, 2xx_rate, 2xx_percentage などが出てくるので、グラフにしたい値をtype growthforecast を指定するstore 内に設定する。
ここではを数を数える例なので *_count を指定。

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

<match apache.access>
  #type file
  #path /var/log/fluent/access
  type forward
  flush_interval 1
  <server>
    host 192.168.0.10
    name logserver
    port 24224
  </server>
</match>
  • fluentd log server
<source>
  type forward
</source>
<match apacche.status>
  <store>
    type datacounter
    count_interval 10
    count_key code
    tag apache_result.status
    aggregate all
    # patternX: X(1-9)
    pattern1 2xx ^2\d\d$
    pattern2 3xx ^3\d\d$
    pattern3 4xx ^4\d\d$
    pattern4 5xx ^5\d\d$
  </store>
</match>

<match apache_result.status>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type growthforecast
    gfapi_url http://192.168.0.1:5125/api/
    remove_prefix apache_result
    service   app
    section   apache
    name_keys 2xx_count,3xx_count,4xx_count,5xx_count
  </store>
</match>


これでgrowthforecast の app / apache 以下に

  • status_2xx_count
  • status_3xx_count
  • status_4xx_count
  • status_5xx_count

等が出来る。remove_prefix しているのは、グラフ内の文字列がapache_result.status_2xx_count と名前が長くなって見難くなるのが嫌なので。(もしくは apache.status 内の設定でtag status のようにprefixを付けないようにするか)

あとはgrowthforecast側で適当な名前で複合グラフを作成すれば良い。こんなのが間単に描ける。


補足

上のグラフで50x の割合多くね?と思われるかもしれませんが、確認用のために、cgiでrandomなstatus codeを返したログをfluentdに渡していただけなので、しょぼいサーバを運用しているとか、そういうわけではありません。